Почему деление на ноль в стандарте 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 было бы уместным, - если система с уверенностью знает, что знаменатель действительно, ровно нуль. И это невозможно, если нет специального способа обозначить это, что добавит служебные данные.