如何比较精度为5位的双精度数

How to compare doubles with 5 digits of precision?

本文关键字:5位 双精度 精度 何比较 比较      更新时间:2023-10-16

我试图比较两个双精度落在[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.000001当限于通常的64位IEEE浮点表示时,实际上是1.0000009999999999177333620536956004798412。同样,1.000002实际上是1.0000020000000000575113290324225090444087。这两者的差别比0.000001更小。

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

    const double epsilon = 0.0000011;

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