我最初尝试了这个(用vb.net)
(Double.MinValue + Double.Epsilon) > Double.MinValue
但是那个结果为假。然后我尝试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
那也是 false 的评估结果。
为什么?
我最初尝试了这个(用vb.net)
(Double.MinValue + Double.Epsilon) > Double.MinValue
但是那个结果为假。然后我尝试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
那也是 false 的评估结果。
为什么?
将一个非常小的(数量级)值加到一个非常大的(数量级)中几乎不会有任何影响。在这种情况下,差异非常小,以至于它在double
的精度范围内无法表示。基本上:
double.MinValue + (most things) === double.MinValue
它不能保证能够表示double.MinValue
和double.MaxValue
之间每一个double
值,随着数值的增加,所能表示的绝对精度会降低。
不要忘记:double.MinValue
在小数点前有308位数字。你只改变了其中极少量的数字。你基本上在做以下操作:
-179769313486232000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000 // yikes!
+ 999999999999999999
请记住,double
大约有17个有效数字,所以那个巨大的数字中大约可以忽略291位数字。
double.MinValue + most_things === most_things
。 - Mikedouble.MinValue
是具有最小幅度的数字 (~1e-308)
,我没有意识到它是一个具有较大幅度的负数。 - Mike