我想比较2个双打,它们是[0.0,1.0]。
我的功能(取自https://stackoverflow.com/a/17341) -
inline bool isEqual(double x, double y)
{
const double epsilon = 0.000001;
return fabs(x - y) < epsilon;
}
使用 -
cerr << isEqual(1.000001, 1.000002) << endl;
cerr << isEqual(1.000010, 1.000020) << endl;
输出是 -
0
0
我期待首先成为true
,其次是false
。请告诉我哪里出错了以及如何解决?
答案 0 :(得分:6)
1.000001
当限于通常的64位IEEE浮点表示时,实际上是1.0000009999999999177333620536956004798412
。同样,1.000002
实际上是1.0000020000000000575113290324225090444087
。这两者比0.000001
稍微分开。
你可以使用一个稍微大一点的比较值来捕捉这个:
const double epsilon = 0.0000011;
完全消除浮点数的任何舍入问题是不可能的。