为什么评估“(Double.MinValue + 1)> Double.MinValue”为false?

时间:2014-09-24 08:51:06

标签: .net double

我第一次尝试这个(在vb.net中)

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

但评估为false。然后我尝试了这个

(Double.MinValue + 999999999999999999) > Double.MinValue

也评估为假。

为什么?

1 个答案:

答案 0 :(得分:15)

将非常小的(幅度)值添加到非常大的(幅度)使得:几乎没有差别。在这种情况下,差异很小,无法在double的精度内表示。基本上是:

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

它不能保证能够代表doubledouble.MinValue之间的每一个double.MaxValue,并且当您增加幅度时,可以表示的绝对分辨率会降低。

不要忘记:double.MinValue在小数位前有 308位。你改变的很少。你基本上是这样做的:

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

请注意,double 大致 17位精度;所以这个庞大数字的291位数在很大程度上可以被忽略。