双溢出

Ser*_*pov 17 .net c#

我有双重类型的问题.在MSDN上,我读到了以下最大双倍值:

超过Double.MaxValue的操作的结果是Double.PositiveInfinity.

我写了一些测试:

Console.WriteLine(double.MaxValue + 100000 - double.MaxValue);
Console.WriteLine(double.MaxValue);
Console.WriteLine(double.MaxValue + 100000);
Console.WriteLine(double.IsPositiveInfinity(double.MaxValue + 100000));
Run Code Online (Sandbox Code Playgroud)

并看到了这个结果:

0
1,79769313486232E+308
1,79769313486232E+308
False
Run Code Online (Sandbox Code Playgroud)

我不明白,double.MaxValue + 100000不是正无穷大,而是等于MaxValue的两倍.根据msdn文档,我认为它应该是PositiveInfinity.

我在VS2012,.NET 4.5中测试过它

Mar*_*ell 24

这是四舍五入/精确; 从长度为309位(小数点前)的数字的角度来看,100000基本上为零.你不妨补充一下0.

如果你尝试double.MaxValue * 2- 即实际上会引起注意的东西,那么它将显示为正无穷大.

  • @ServéLaurijssen当然不是数学上正确的; `double`,`float`和`decimal`都是近似值(虽然`double` /`float`采用不同的方法来表示逼近而不是`decimal`).如果你采用一个**非常大的**数字并且做一个非常小的**改变它,那么完全可以预期它会因为精确而完全丢失.最终,`double`需要以8个字节存储各种各样的数字; 这样做的方式很多,只有很多可以表达的数字.你能用8个字节存储`Math.PI`吗? (12认同)
  • 有趣的是,基本上它在数学上与双打不正确吗? (2认同)
  • @ServéLaurijssen这个主题有趣[文章](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) (2认同)

Mar*_*age 10

Double只有大约15个十进制数字的精度因此当你添加Double.MaxValue100000D没有溢出因为必须在第300个数字之后添加1in 并且这与添加0相同.100000DDouble.MaxValue

如果您执行以下计算

Double.MaxValue + Double.MaxValue/1e16
Run Code Online (Sandbox Code Playgroud)

你得到积极的无限.

  • @thefiloe`double` /`float`不会抛出被零除,溢出等; 整数这样做 (4认同)