Sta*_*tas 75 floating-point d floating-accuracy constantfolding
assert(0.1 + 0.2 != 0.3); // shall be true
Run Code Online (Sandbox Code Playgroud)
是我最喜欢的检查,语言使用本机浮点运算.
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud)
print(0.1 + 0.2 != 0.3)
Run Code Online (Sandbox Code Playgroud)
输出:
True
Run Code Online (Sandbox Code Playgroud)
为什么D不适用?理解D使用本机浮点数.这是一个错误吗?他们是否使用某些特定的数字代表?别的什么?很混乱.
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Run Code Online (Sandbox Code Playgroud)
输出:
false
Run Code Online (Sandbox Code Playgroud)
码:
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
}
Run Code Online (Sandbox Code Playgroud)
输出:
false
true
Run Code Online (Sandbox Code Playgroud)
Lig*_*ica 53
(Flynn的回答是正确的答案.这个问题更普遍地解决了这个问题.)
您似乎在假设OP,您的代码中的浮点不准确性是确定性的并且可预测错误(在某种程度上,您的方法与那些不了解浮点的人的方法相反).
虽然(正如Ben所指出的)浮点不准确性是确定性的,但从代码的角度来看,如果你不是非常谨慎地考虑每一步中你的价值观发生了什么,情况就不是这样了.任何数量的因素都可能导致0.1 + 0.2 == 0.3成功,编译时优化成为一个,这些文字的调整值是另一个.
无论是成功还是失败,都不在此; 不管怎样都不要依赖浮点相等.
Fly*_*179 47
它可能被优化为(0.3!= 0.3).这显然是假的.检查优化设置,确保它们已关闭,然后重试.
| 归档时间: |
|
| 查看次数: |
17616 次 |
| 最近记录: |