2014-10-18 107 views
2

當比較大的變化雙打它發生下列測試失敗:比較與Double.MaxValue

[Test] 
public void DoubleMaxValueTest() 
{ 
    double val = Double.MaxValue; 
    double epsilon = 10000.0; 
    Assert.IsTrue(val > (Double.MaxValue - epsilon)); 
} 

意識到作爲雙打被表示爲尾數,指數和符號位是由於這樣的事實: Double.MaxValue - 10000的值實際上表示方式與Double.MaxValue相同(這些值相等)。

問題是:如何獲得此測試返回true的最小epsilon?

+2

如果你明白爲什麼測試失敗,最好是如果你從問題的開始就明確*,而不是在最後一部分改變問題。 – 2014-10-18 16:40:54

+0

看看[這個問題](http://stackoverflow.com/questions/15330644/get-next-smallest-double-number)。 – Zong 2014-10-18 16:41:20

+0

@Jon:你說得對,我希望現在更清楚。 – 2014-10-18 17:10:40

回答

5

要回答最後問題,因爲它聽起來像你真正明白爲什麼測試失敗...

IEEE-754有着簡潔的屬性,如果你把相鄰的按位值,這些最終會被相鄰可表示double值。

using System; 

class Test 
{ 
    static void Main() 
    { 
     long maxDoubleBits = BitConverter.DoubleToInt64Bits(Double.MaxValue); 
     double nextLargestDouble = BitConverter.Int64BitsToDouble(maxDoubleBits - 1); 
     double difference = double.MaxValue - nextLargestDouble; 
     Console.WriteLine(difference); 
    } 
} 

結果是1.99584030953472E + 292

:所以,你可以通過下述方法進行 MaxValue位模式爲整數,減去1,並轉動結果返回到 double找到「第二高」表示的 double

現在,差異是實際MaxValue之間的差異和次高值。因此,您可以從double.MaxValue中扣除的最小金額以獲得不是的值MaxValue實際上是difference/2