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

Vin*_*arg 0 c++ precision double

我想比较两个落在[0.0,1.0]的双打.

我的功能(取自/sf/answers/1213901/) -

inline bool isEqual(double x, double y)
{
    const double epsilon = 0.000001;
    return fabs(x - y) < epsilon;
}
Run Code Online (Sandbox Code Playgroud)

用法-

cerr << isEqual(1.000001, 1.000002) << endl;
cerr << isEqual(1.000010, 1.000020) << endl;
Run Code Online (Sandbox Code Playgroud)

输出是 -

0
0
Run Code Online (Sandbox Code Playgroud)

而我期待第一个true,第二个false.请告诉我哪里出错了以及如何解决?

Mar*_*som 6

1.000001实际上,当限于通常的64位IEEE浮点表示时1.0000009999999999177333620536956004798412.同样1.000002实际上是1.0000020000000000575113290324225090444087.这两者相距甚远0.000001.

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

    const double epsilon = 0.0000011;
Run Code Online (Sandbox Code Playgroud)

实际上不可能完全消除浮点数的任何舍入问题.