2014-09-24 79 views
11

我第一次尝试这样做(在vb.net)为什么评估“(Double.MinValue + 1)> Double.MinValue”为false?

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

,但计算结果为假。然后我试了这个

(Double.MinValue + 999999999999999999) > Double.MinValue 

也评估为false。

为什么?

+0

现在我发现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

回答

15

将一个非常小的(幅度)值添加到一个非常大的(幅度)使得:几乎没有差异。在这种情况下,差异非常小,因此其不能表示为,其精度范围为double。基本上是:

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

它并不能保证能够代表每一个doubledouble.MinValuedouble.MaxValue之间,并为您增加幅度,什么可以表示减少的绝对分辨率。

别忘了:double.MinValue已有308位数字小数点前的位置。你正在改变其中很少。你基本上是这样做的:

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

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

+0

double.MinValue * 0.999999999999> double.MinValue应该工作,如果你想要的数字不如double.MinValue那样负数。 – gnasher729 2014-09-24 09:26:19

+0

我认为它应该是'double.MinValue + most_things === most_things' – Mike 2014-09-24 13:49:23

+0

@Mike为什么,到底是什么? – 2014-09-24 13:59:50

相关问题