如何比较5位精度的双打?

时间:2013-06-20 15:47:41

标签: c++ double precision

我想比较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。请告诉我哪里出错了以及如何解决?

1 个答案:

答案 0 :(得分:6)

1.000001当限于通常的64位IEEE浮点表示时,实际上是1.0000009999999999177333620536956004798412。同样,1.000002实际上是1.0000020000000000575113290324225090444087。这两者比0.000001稍微分开。

你可以使用一个稍微大一点的比较值来捕捉这个:

    const double epsilon = 0.0000011;

完全消除浮点数的任何舍入问题是不可能的。