Почему существует NaN? - PullRequest
       76

Почему существует NaN?

0 голосов
/ 11 декабря 2018

Я не спрашиваю «почему это вычисление приводит к NaN», я спрашиваю «Почему NaN вообще существует, а не приводит к исключению или ошибке?»

Мне было интереснонекоторое время, и обсуждал это с людьми иногда.

Единственные ответы, которые я получил, были «Ну, ты же не хочешь пытаться поймать каждую операцию деления, не так ли?» или «Есть сценарии, в которыхNaN является действительным результатом ".

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

Вы хотите, чтобы программа аварийно завершилась и тут же умерла, чтобы вы могли легко найти, где произошла ошибка.Это вместо того, чтобы позволить программе работать безнадежно, возможно записывать поврежденные данные, возможно отправлять поврежденные данные или делать всякие неприятные вещи - до неизбежного сбоя.(Как сказано в «Прагматичном программисте» - «Не разбирайся»должна быть причина его существования. Что это за причина?

1 Ответ

0 голосов
/ 19 декабря 2018

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

«Почему NaN вообще существует, а не вызывает исключение или ошибку?»

Потому что это не исключение и не ошибка.Это совершенно достоверный результат для расчета.У вас есть несколько вариантов использования в математике, где вы получаете эквивалент «NaN», то есть то, что не может быть измерено.Подумайте о расчете пересечения между двумя параллельными линиями.Или расчет массы фотона .

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

  • Они не являются ошибками , переменные имеют значения, которые им необходимы, вычисления выполнены, и это результат.К сожалению, не действительное число (может быть, сложное? Может быть, неопределенность, которая может быть решена с помощью других математических методов?), Тем не менее у вас есть ответ на расчет.
  • Они не являются исключениями нет ничего плохого в вашем коде, это не аномальное условие, это ответ: «NaN» (где вы ожидаете 42?).Не нужно останавливать поток вашей программы здесь: сообщите пользователю, что расчет не имеет решения или он не определен, и пусть он будет доволен этим ( примечание: я немного вру, читаю последниепункт ).

Вы хотите, чтобы программа аварийно завершилась и тут же умерла, чтобы вы могли легко найти, где произошла ошибка.

Вы совершенно правы: вы все равно можете рассматривать это как исключение или как ошибку, если концепция NaN не является допустимым результатом в контексте вашей программы . Представьте себе расчет необходимого диаметра колонны для футбольного стадиона и получение NaN.Тьфу ... это было бы ошибкой, я хочу построить этот стадион, дай мне диаметр!Вы также совершенно не правы: пожалуйста, не говорите, что «легко» найдете, где все пошло не так, просто потому, что вы вызвали исключение после NaN.Я знал некоторых людей, отлаживающих метеорологические модели, которые хотели бы поговорить с вами (эти уравнения неинтересны).

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

И если вы прочтете до этого, позвольте мне сказать вам, что я немного лгал вам ради упрощения.Связанный IEEE определяет два вида NaN: тихие и сигнальные.Я говорил о тихих, хороших парнях. Сигнализаторы вызовут исключения в вашем программном обеспечении (переполнение, недостаточное заполнение и т. Д.).

...