【发布时间】:2012-07-03 09:42:22
【问题描述】:
据我了解,大名鼎鼎的
(0.1 + 0.2) !== 0.3
gotcha 实际上并不是 Javascript 的错。这正是 IEEE 754 的工作方式。类似的输出出现在 Python 中,它也遵循 IEEE 754 规则。
那么这个特定的例子是如何在 C 中按预期工作的,有时。如果我直接比较
printf("%d\n", (0.1+0.2) == 0.3);
我得到了(未?)预期的输出 0,但如果我将这些值放入变量中或打印出来,我会得到正确四舍五入的答案。
IEEE 754 的 C 实现是否做了额外的事情?还是我完全错过了其他东西。
更新
我发布的代码示例由于拼写错误而损坏。试试这个 Fixed C Runnable Example
但原来的问题仍然存在。
double d1, d2, d3;
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
printf ("%.17f\n", d1+d2);
printf ("%d\n", ((d1+d2) == d3));
输出是
1
0.30000000000000004
1
现在改写的问题是:
-
C 编译器为什么(以及何时以及如何)冒昧地这么说
0.3 == 0.30000000000000004
鉴于所有事实,C 实现而不是 Javascript 的实现不正确吗?
【问题讨论】:
-
在您的代码示例中,您实际上从未打印任何非整数的数字。
-
你的问题与 JavaScript 没有任何关系。它与 C 和双打处理有关,有时你会得到一个结果,而其他时候你会得到不同的结果。 (我的猜测是,有时,预处理器正在做数学运算,所以编译器看到的是
printf("%d\n", 0.3 == 0.3);,但这只是一个猜测。) -
@Manav:即使您还提供了链接,也请始终在问题本身中包含相关代码(和输出)。您当前在问题中拥有的代码与您链接到的代码不同,并且链接可能会失效。更多:meta.stackexchange.com/questions/118392/…
-
@Alnitak 所以?这有关系吗?
-
请注意,GCC 与 MSVC 的“破坏方式不同”。查看不同的编译器如何给出不同的结果:stackoverflow.com/questions/10912128/…
标签: javascript c floating-point ieee-754