为什么不向Double.MaxValue添加数字使其成为Double.PositiveInfinity?

时间:2015-03-25 17:54:45

标签: c#

Double.PositiveInfinity文档中写道:

  

当操作结果大于MaxValue时,返回此常量。

但是,当我尝试将某个数字添加到double的最大值时,它不会返回infinity。我试过这个:

double maxVal = Double.MaxValue;
maxVal = maxVal + 10000000000000000000;
Console.WriteLine(maxVal + " " + Double.IsInfinity(maxVal)); //prints 1.79769313486232E+308 False

为什么会这样?为什么不将maxVal显示为infinity

Here is a working fiddle.

2 个答案:

答案 0 :(得分:8)

这是因为您添加的数字方式太小而无法对Double.MaxValue值产生影响。

double的精确度约为15位数,因此您需要一个至少为1e292的数字才能使其大到足以产生差异。

那将是10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000写出来的。

答案 1 :(得分:0)

  • 根据定义,{/ 3}}在
  • 时返回true

(*(long*)(&d) & 0x7FFFFFFFFFFFFFFF) == 0x7FF0000000000000;

当您在示例中替换它时,您会看到double.MaxValue哪个值1.7976931348623157E+308 + 10000000000000000000仍然小于转化后的0x7FF0000000000000

  • 为什么返回double.MaxValue,因为根据数学定义,X+z=X表示X值更大,z更小。