Двойное переполнение

У меня есть проблемы с двойным типом. В 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));

И увидел этот результат:

0
1,79769313486232E+308
1,79769313486232E+308
False

Я не понимаю, double.MaxValue + 100000 не является положительной бесконечностью, но равен удвоенному MaxValue. Я думаю, что это должно быть PositiveInfinity, согласно документации msdn.

Я тестировал его в VS2012,.NET 4.5

Ответы

Ответ 1

Это округление/точность; с точки зрения числа, которое составляет 309 цифр (до десятичного разряда), 100000 по существу равно нулю. Вы также можете добавить 0.

Если вы попробуете double.MaxValue * 2 - то есть что-то, что на самом деле будет заметно для него, тогда оно будет отображаться как положительная бесконечность.

Ответ 2

Double имеет только около 15 десятичных цифр точности, поэтому, когда вы добавляете Double.MaxValue в 100000D, переполнение не происходит, потому что 1 в 100000D необходимо добавить после 300-й цифры Double.MaxValue и это то же самое, что добавить 0.

Если вы выполните следующий расчет

Double.MaxValue + Double.MaxValue/1e16

вы получаете положительную бесконечность.