#c# #.net
Вопрос:
В Двойном Размере.В документах PositiveInfinity написано, что:
Эта константа возвращается, когда результат операции превышает максимальное значение.
Однако, когда я пытаюсь добавить число к максимальному значению double
, оно не возвращается infinity
. Я пробовал запустить это:
double maxVal = Double.MaxValue;
maxVal = maxVal 10000000000000000000;
Console.WriteLine(maxVal " " Double.IsInfinity(maxVal)); //prints 1.79769313486232E 308 False
Почему это происходит? Почему это не проявляется maxVal
как infinity
?
Комментарии:
1. Значение
10000000000000000000
просто невелико, чтобы иметь какое-либо значение.
Ответ №1:
Это потому, что число, которое вы добавляете, слишком мало, чтобы повлиять на Double.MaxValue
значение.
Точность a double
составляет около 15 цифр, поэтому вам нужно число, которое, по крайней мере 1e292
, должно быть достаточно большим, чтобы иметь значение.
Это было бы 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
записано.
Комментарии:
1. Но почему она не переполняется? Вы продолжаете добавлять числа в double, и оно остается на Double.MaxValue? Я просто добавил
8000000000000000000
доMaxValue
100000 раз в цикле, и это все ещеMaxValue
так .2. @MillieSmith вы добавили 8E 23. Это будет примерно 285 — й символ после точки для максимального значения. Однако длина мантиссы в двойном размере составляет всего 15 символов. Добавление 8E 23 на самом деле не изменило номер.
3. @AndreySarafanov Да, но я не понимаю, почему они сделали это таким образом. Я только что сделал
max = 1e292
это , и теперьDouble.IsInfinity
возвращает истину. С ним это не работает1e291
. Я бы ожидал, что поведение будет определено по-другому.4. Это хороший ответ @MillieSmith попробуйте следующее после добавления 80000000000000000 в maxVal, Консоль. WriteLine(maxVal == double.MaxValue); и обратите внимание, что maxVal == Double.MaxValue возвращает значение true, это связано с тем, как работает арифметика для двойников. en.wikipedia.org/wiki/Floating_point .
5. @TimSchmelter: Результат
double.MaxValue 1
на самом делеdouble.MaxValue
таков . Компьютер не может использовать бесконечную точность при сложении чисел, поэтому значение1
исчезает, когда оно попадает в тот же диапазон,double.MaxValue
что и . Другим примером этого может быть1 1e-20
, где результат1
. Если вы попытаетесь представить1.00000000000000000001
как adouble
, вы получите1
, поскольку этот последний десятичный знак выходит за пределы точностиdouble
.
Ответ №2:
- По определению, IsInfinity(double d) возвращает значение true, когда
(*(long*)(amp;d) amp; 0x7FFFFFFFFFFFFFFF) == 0x7FF0000000000000;
Когда вы замените его в своем примере, вы увидите, double.MaxValue
что значение 1.7976931348623157E 308
10000000000000000000
все еще меньше, чем 0x7FF0000000000000
после преобразования.
- Почему он возвращается
double.MaxValue
, потому что, согласно математическому определению,X z=X
для очень больших значений X и наименьшего из z.