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.请告诉我哪里出错了以及如何解决?
1.000001实际上,当限于通常的64位IEEE浮点表示时1.0000009999999999177333620536956004798412.同样1.000002实际上是1.0000020000000000575113290324225090444087.这两者相距甚远0.000001.
你可以使用一个稍微大一点的比较值来捕捉这个:
const double epsilon = 0.0000011;
Run Code Online (Sandbox Code Playgroud)
实际上不可能完全消除浮点数的任何舍入问题.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |