我第一次尝试这个(在vb.net中)
(Double.MinValue + Double.Epsilon) > Double.MinValue
但评估为false。然后我尝试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
也评估为假。
为什么?
答案 0 :(得分:15)
将非常小的(幅度)值添加到非常大的(幅度)使得:几乎没有差别。在这种情况下,差异很小,无法在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位数在很大程度上可以被忽略。