Dot-Net

為什麼將“(Double.MinValue + 1)> Double.MinValue”評估為假?

  • September 24, 2014

我第一次嘗試這個(在 vb.net 中)

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

但這評估為假。然後我嘗試了這個

(Double.MinValue + 999999999999999999) > Double.MinValue

這也評估為假。

為什麼?

將非常小的(幅度)值添加到非常大的(幅度)中:幾乎沒有區別。在這種情況下,差異是如此之小,以至於無法在 的精度內表示double。基本上:

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

它不能保證能夠表示 和 之間的每一個,double並且隨著幅度的增加,可以表示的絕對解析度會降低。double.MinValue``double.MaxValue

不要忘記:小數點前double.MinValue308 位。你改變的很少。你基本上是在做:

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

請記住,double它的精度大約為 17 位;所以這個巨大數字中的大約 291 位可以在很大程度上被忽略。

引用自:https://stackoverflow.com/questions/26012528