2014-09-24 78 views
11

我第一次嘗試這樣做(在vb.net)爲什麼評估「(Double.MinValue + 1)> Double.MinValue」爲false?

(Double.MinValue + Double.Epsilon) > Double.MinValue 

,但計算結果爲假。然後我試了這個

(Double.MinValue + 999999999999999999) > Double.MinValue 

也評估爲false。

爲什麼?

+0

現在我發現http://msdn.microsoft.com/de-de/library/system.double.epsilon%28v=vs.110%29.aspx:「但是,Epsilon屬性不是一般性的度量Double類型的精度;它僅適用於值爲零或指數爲-1022的Double實例。「 – habakuk 2014-09-24 13:42:35

回答

15

將一個非常小的(幅度)值添加到一個非常大的(幅度)使得:幾乎沒有差異。在這種情況下,差異非常小,因此其不能表示爲,其精度範圍爲double。基本上是:

double.MinValue + (most things) === double.MinValue 

它並不能保證能夠代表每一個doubledouble.MinValuedouble.MaxValue之間,併爲您增加幅度,什麼可以表示減少的絕對分辨率。

別忘了:double.MinValue已有308位數字小數點前的位置。你正在改變其中很少。你基本上是這樣做的:

-179769313486232000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000 // yikes! 
+ 999999999999999999 

記住double具有精度大致 17位;所以這個龐大數字的大約291個數字可以在很大程度上被忽略。

+0

double.MinValue * 0.999999999999> double.MinValue應該工作,如果你想要的數字不如double.MinValue那樣負數。 – gnasher729 2014-09-24 09:26:19

+0

我認爲它應該是'double.MinValue + most_things === most_things' – Mike 2014-09-24 13:49:23

+0

@Mike爲什麼,到底是什麼? – 2014-09-24 13:59:50

相關問題