Двойное переполнение
У меня есть проблемы с двойным типом.
В 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
вы получаете положительную бесконечность.