【发布时间】:2011-10-16 00:07:09
【问题描述】:
assert(0.1 + 0.2 != 0.3); // shall be true
是我最喜欢的检查语言是否使用本机浮点运算。
C++
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
输出:
1
Python
print(0.1 + 0.2 != 0.3)
输出:
True
其他示例
为什么这对 D 不成立?据了解,D 使用本机浮点数。这是一个错误吗?他们是否使用某些特定的数字表示?还有什么?相当混乱。
D
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
输出:
false
更新
感谢LukeH。这是there 中描述的浮点常量折叠的效果。
代码:
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3); // constant folding is done in real precision
auto a = 0.1;
auto b = 0.2;
writeln(a + b != 0.3); // standard calculation in double precision
}
输出:
false
true
【问题讨论】:
-
请将相关代码示例直接放在问题中,不要放在外部链接中。既要确保问题中的全部信息保留下来,又要使其更易于阅读。
-
我本想反射性地点击关闭按钮,直到我注意到你写的是
==而不是!=。 -
关于您的更新:这不是编译器优化器的“问题”。这是合法的浮点行为,发生这种情况的可能性在 D 文档的"Floating Point Constant Folding" section 中进行了说明。
-
请看看当你使用
real类型而不是double类型时会发生什么:ideone.com/NAXkM -
@Jean Hominal:真实类型的案例很有趣。想...
标签: floating-point floating-accuracy d constantfolding