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


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

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

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

(Double.MinValue + 999999999999999999) > Double.MinValue

也评估为假。

为什么?


5375
2017-09-24 08:51


起源

现在我找到了 msdn.microsoft.com/de-de/library/...:“但是,Epsilon属性不是Double类型精度的一般度量;它仅适用于值为零或指数为-1022的Double实例。” - habakuk


答案:


将非常小(幅度)的值添加到非常大(幅度)使得:几乎没有差别。在这种情况下,差异是如此之小 不能代表 在精度范围内 double。基本上:

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

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

别忘了: double.MinValue 具有 308位数 在小数点之前。你改变的很少。你基本上是这样做的:

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

请记住 double 具有 大致 17位精度;所以这个庞大数字的291位数可以在很大程度上被忽略。


15
2017-09-24 08:54



double.MinValue * 0.999999999999> double.MinValue应该工作,如果你想要一个不像double.MinValue那么负的数字。 - gnasher729
我认为应该是 double.MinValue + most_things === most_things - Mike
@Mike为什么,到底? - Marc Gravell♦
@MarcGravell我的坏,我原以为 double.MinValue 是数量最小的数字 (~1e-308) 我没有意识到这是一个很大的负数。 - Mike