Почему деление на ноль в стандарте IEEE754 приводит к бесконечной ценности?

Мне просто интересно, почему в IEEE-754 любое ненулевое число с плавающей точкой, деленное на ноль, приводит к бесконечному значению? Это абсурд с математической точки зрения. Поэтому я считаю, что правильным результатом для этой операции является NaN.

Функция f (x) = 1/x не определена, когда x = 0, если x - действительное число. Например, функция sqrt не определена для любого отрицательного числа и sqrt (-1.0f), если IEEE-754 создает значение NaN. Но 1.0f/0 - Inf.

Но почему-то это не так в IEEE-754. Должна быть причина для этого, возможно, некоторые соображения оптимизации или совместимости.

Итак, какая точка?

Ответ 1

Это абсурд с математической точки зрения.

Да. Нет. Сортировка.

Дело в том, что числа с плавающей запятой - это приближения. Вы хотите использовать широкий диапазон экспонентов и ограниченное количество цифр и получать результаты, которые не совсем ошибочны.:)

Идея IEEE-754 заключается в том, что каждая операция может инициировать "ловушки", которые указывают на возможные проблемы. Они

  • Незаконная (бессмысленная операция, такая как sqrt отрицательного числа)
  • Переполнение (слишком большое)
  • Underflow (слишком маленький)
  • Деление на ноль (вещь вам не нравится)
  • Неточная (эта операция может дать неверные результаты, потому что вы теряете точность)

Теперь многие люди, такие как ученые и инженеры, не хотят беспокоиться о написании ловушек. Поэтому Кахан, изобретатель IEEE-754, решил, что каждая операция также должна возвращать разумное значение по умолчанию, если не существует никаких ловушек.

Они

  • NaN для незаконных значений
  • подписанные бесконечности для переполнения
  • подписанные нули для Underflow
  • NaN для неопределенных результатов (0/0) и бесконечностей для (x/0 x!= 0)
  • результат нормальной работы для Inexact

Дело в том, что в 99% случаев случаи нулей вызваны недостаточным потоком и, следовательно, в 99% из всех времен Бесконечность является "правильной", даже если она ошибочна с математической точки зрения.

Ответ 2

Я не уверен, почему вы считаете, что это абсурд.

Простейшее определение a / b, по крайней мере для ненулевого b, является уникальным числом b, которое должно быть вычтено из a, прежде чем вы достигнете нуля.

Развернув это на случай, когда b может быть нулевым, число, которое должно быть вычтено из любого ненулевого числа, чтобы получить нуль, действительно бесконечно, потому что вы никогда не достигнете нуля.

Другой способ взглянуть на это - поговорить с точки зрения ограничений. Когда положительное число n приближается к нулю, выражение 1 / n приближается к "бесконечности". Вы заметите, что я процитировал это слово, потому что я твердо убежден в том, что не распространяю заблуждение, что бесконечность на самом деле является конкретным числом: -)

NaN зарезервирован для ситуаций, когда число не может быть представлено (даже приблизительно) любым другим значением (включая бесконечности), оно считается отличным от всех других значений.

Например, 0 / 0 (используя наше упрощенное определение выше) может иметь любое количество b, вычитаемое из a, чтобы достичь 0. Следовательно, результат неопределен - это может быть 1, 7, 42, 3.14159 или любое другое значение.

Точно так же, как и квадратный корень отрицательного числа, который не имеет значения в реальной плоскости, используемой IEEE754 (для этого вам нужно перейти на сложную плоскость), не может быть представлено.

Ответ 3

Правильный ответ здесь состоит в том, что стандарт использует предел, где он существует, и только указанный NaN, когда нет даже предела. При п > 0 предел n/x as x -> 0 является положительной бесконечностью. Когда n < 0, это отрицательная бесконечность. Когда n == 0, то у вас нет никакого предела, так как, приближаясь к форме слева, вы получаете отрицательную бесконечность и, приближаясь справа, получаете положительную бесконечность. Из исчисления, когда левый и правый пределы не совпадают, у вас нет предела.

Ответ 4

В математике деление на ноль undefined, потому что ноль не имеет знака, поэтому два результата одинаково возможны и исключительны: отрицательная бесконечность или положительная бесконечность (но не оба).

В (большинстве) вычислений 0.0 имеет знак. Поэтому мы знаем, с каким направлением мы приближаемся, и какой знак бесконечности имел бы. Это особенно верно, когда 0.0 представляет ненулевое значение, слишком малое, чтобы быть выраженным системой, как это часто бывает.

Единственное время, когда NaN было бы уместным, - если система с уверенностью знает, что знаменатель действительно, ровно нуль. И это невозможно, если нет специального способа обозначить это, что добавит служебные данные.