为什么double.MaxValue + double.Epsilon不是double.Infinity?

时间:2015-08-19 04:10:31

标签: c# .net floating-point double .net-4.5

我正在经历this answer但无法回答一件事。可能是因为我有一位数学家的心态,所以如果这个问题太简单,请原谅我。

为什么这不会导致无限。

double.MaxValue + double.Epsilon

然而,Epsilon的小值,无论何时加到最大值,都应该以较小的精度增加最大值。为什么在这种情况下没有增加?

以下是我一直在尝试的dotnetfiddle

1 个答案:

答案 0 :(得分:2)

在默认的最近舍入模式中,加法的数学结果必须高于double.MaxValue和下一个浮点值之间的中间点,如果指数范围更宽,则可以表示下一个浮点值浮点结果向上舍入到无穷大。

导致double.MaxValue与此中间点之间的数学结果的操作向下舍入为double.MaxValue

double.Epsilon远小于double.MaxValue与此中间点之间的距离,因此浮点加法的结果为double.MaxValue

这种现象一般称为“吸收”(不仅在其中一个加数为double.MaxValue时,而且只要求和之间的比率使得结果与最大加数相同)。