0

我正在尝试比较落在 [0.0, 1.0] 中的2 个双打。

我的函数(取自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。请告诉我哪里出了问题以及如何解决?

4

1 回答 1

6

1.000001当限于通常的 64 位 IEEE 浮点表示时,实际上是1.0000009999999999177333620536956004798412. 其实1.000002也是一样1.0000020000000000575113290324225090444087。两者之间的距离比0.000001.

您可以使用一个非常大的比较值来捕捉这一点:

    const double epsilon = 0.0000011;

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

于 2013-06-20T15:53:30.190 回答