2013-06-20 67 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