我第一次尝试这样做(在vb.net)为什么评估“(Double.MinValue + 1)> Double.MinValue”为false?
(Double.MinValue + Double.Epsilon) > Double.MinValue
,但计算结果为假。然后我试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
也评估为false。
为什么?
我第一次尝试这样做(在vb.net)为什么评估“(Double.MinValue + 1)> Double.MinValue”为false?
(Double.MinValue + Double.Epsilon) > Double.MinValue
,但计算结果为假。然后我试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
也评估为false。
为什么?
将一个非常小的(幅度)值添加到一个非常大的(幅度)使得:几乎没有差异。在这种情况下,差异非常小,因此其不能表示为,其精度范围为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个数字可以在很大程度上被忽略。
double.MinValue * 0.999999999999> double.MinValue应该工作,如果你想要的数字不如double.MinValue那样负数。 – gnasher729 2014-09-24 09:26:19
我认为它应该是'double.MinValue + most_things === most_things' – Mike 2014-09-24 13:49:23
@Mike为什么,到底是什么? – 2014-09-24 13:59:50
现在我发现http://msdn.microsoft.com/de-de/library/system.double.epsilon%28v=vs.110%29.aspx:“但是,Epsilon属性不是一般性的度量Double类型的精度;它仅适用于值为零或指数为-1022的Double实例。“ – habakuk 2014-09-24 13:42:35