为什么将"(Double.MinValue + 1)> Double.MinValue"评估为false?

hab*_*kuk 11 .net double

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

(Double.MinValue + Double.Epsilon) > Double.MinValue
Run Code Online (Sandbox Code Playgroud)

但评估结果为假.然后我尝试了这个

(Double.MinValue + 999999999999999999) > Double.MinValue
Run Code Online (Sandbox Code Playgroud)

也评估为假.

为什么?

Mar*_*ell 15

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

double.MinValue + (most things) === double.MinValue
Run Code Online (Sandbox Code Playgroud)

它不能保证能够代表和double之间的每个单独,并且当你增加幅度时,可以表示的绝对分辨率会降低.double.MinValuedouble.MaxValue

别忘了:小数点前double.MinValue308位数.你改变的很少.你基本上是这样做的:

-179769313486232000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000 // yikes!
+ 999999999999999999
Run Code Online (Sandbox Code Playgroud)

请记住,double大约 17位精度; 所以这个庞大数字的291位数字可以在很大程度上被忽略.