2009-07-29 49 views
1

我希望能夠比較兩個雙打而不考慮可能的精度損失。有沒有辦法處理這種情況?浮點等價?

如果沒有,是否有一個門檻/準則知道兩個雙打之間有多少足夠的等價?

回答

6

閾值完全依賴於問題本身。對於某些問題,您可能會認爲1.001等於1.002,對於某些問題,您可能需要更小的閾值。

一般己技巧是:

Math.Abs(a - b) < some_epsilon // `a` is roughly equivalent to `b` 
+2

這很好,但爲some_epsilon選擇一個合理的值是棘手的。 – 2009-07-29 20:52:46

+0

確實很棘手;並沒有一般的建議。就我個人而言,我在ACM/ICPC幾何問題以及那些需要在解決方案空間進行二進制搜索的問題中經歷過它的詭計。 – 2009-07-29 20:56:50

3

一個很不錯的,這徹底的方法是:

public static bool DoubleEquality(double a, double b) 
{ 
    const double epsilonValue = 1e-15; 
    if (double.IsNaN(a)) 
     return double.IsNaN(b); 
    else if (double.IsInfinity(a)) 
     return double.IsInfinity(b); 
    else if (a == 0) 
     return b == 0; 
    else 
     return Math.Abs(a - b) <= Math.Abs(a * epsilonValue); 
} 

注意Double.Epsilon是不是一個很好的小量值。這會創建一個隨着您的第一個值的大小而略微增加的epsilon,這會有所幫助。