2013-06-20 64 views
0

我想比较2 双打落在[0.0,1.0]。如何比较双精度5位数?

我的功能(从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

你总是会得到浮点错误。即使精确度很高,“晶圆厂(1.000001 - 1.000002)”将等于“0.000001”,并非严格低于此值。 –

+0

该函数名称错误。它不**测试平等,应该被称为'almost_equals'或沿着这条线。 –

回答

6

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

您可以使用一个稍大比较值赶上这样的:

const double epsilon = 0.0000011; 

这真的是不可能完全消除与浮点数任何四舍五入问题。

+0

谢谢!这解决了它。不过,我决定以更高的精度解决问题,并最终以5位精度打印答案。 –

+0

不管怎么说,不是'epsilon = 0.000001'给你**六位数的精度而不是五位数? – Massa