Почему бы не добавить число в Double.MaxValue, чтобы оно удвоилось.Позитивная близость?

#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 как a double , вы получите 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.