2012-11-06 45 views
1

Possible Duplicate:
Most effective way for float and double comparison
How dangerous is it to compare floating point values?比較浮點變量

我有const float M = 0.000001;float input;。我不想對他們進行平等檢查。但我知道直接檢查有副作用M != input。所以,我的問題是如何比較兩個沒有副作用的浮點值?

+3

「副作用」是什麼意思?比較浮游物在該術語的通常含義中沒有副作用。 –

+0

'M!= input'不是(沒有任何)副作用。 –

+0

您可以在這裏找到一篇關於浮點比較的優秀文章:[比較浮點數](http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)。基本上,根據您的要求,您可以使用 - epsilon - 絕對誤差:當約。值的範圍是預先知道的 - ε - 相對誤差:當約。值的範圍是事先不知道的 - 使用整數表示法:當速度是本質的時候。 – Alex

回答

3
const double epsilon = 1e-12; 

if(fabs(input - M) < epsilon) //input == M 
{ 
    //... 
} 
if(fabs(input - M) >= epsilon) // input != M 
{ 
    //... 
} 

的小量的價值更準確的比較小,因此越概率看起來,它會告訴你,這兩個值不相等,而你希望他們被認爲是相等的。 ε值越大,它告訴你結果的概率就越大,實際上你希望它們不相等。 epsilon的價值應根據手頭任務的具體情況來選擇。

+0

我該怎麼做'!='? – user1802858

+0

可能值得指出的是,「epsilon」的實際值取決於應用程序,因此應該插入一個值,使其「足夠」以滿足您的使用需求。 – unwind

+0

@ user1802858將比較運算符切換爲'> ='。 – unwind

0

當比較浮動,你必須比較他們「關閉」,而不是「相等」。根據您的需求定義「close」有多種方法。然而,典型的做法可能是這樣的:

namespace FloatCmp { 

const float Eps = 1e-6f; 

bool eq(float a, float b, float eps = Eps) { 
    return fabs(a - b) < eps; 
} 

//etc. for neq, lt, gt, ... 

} 

然後,使用FloatCmp::eq()代替==比較浮動。