我第一次尝试这个(在vb.net中)
(Double.MinValue + Double.Epsilon) > Double.MinValue
Run Code Online (Sandbox Code Playgroud)
但评估结果为假.然后我尝试了这个
(Double.MinValue + 999999999999999999) > Double.MinValue
Run Code Online (Sandbox Code Playgroud)
也评估为假.
为什么?
Mar*_*ell 15
将非常小(幅度)的值添加到非常大(幅度)使得:几乎没有差别.在这种情况下,差异很小,无法在精度范围内表示double.基本上:
double.MinValue + (most things) === double.MinValue
Run Code Online (Sandbox Code Playgroud)
它不能保证能够代表和double之间的每个单独,并且当你增加幅度时,可以表示的绝对分辨率会降低.double.MinValuedouble.MaxValue
别忘了:小数点前double.MinValue有308位数.你改变的很少.你基本上是这样做的:
-179769313486232000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000 // yikes!
+ 999999999999999999
Run Code Online (Sandbox Code Playgroud)
请记住,double有大约 17位精度; 所以这个庞大数字的291位数字可以在很大程度上被忽略.