Всякий раз, когда я пишу что-то о математике, я боюсь быть сбитым металлическим стержнем настоящим математиком, но здесь мы идем, противостоя нашим страхам:
«Почему NaN вообще существует, а не вызывает исключение или ошибку?»
Потому что это не исключение и не ошибка.Это совершенно достоверный результат для расчета.У вас есть несколько вариантов использования в математике, где вы получаете эквивалент «NaN», то есть то, что не может быть измерено.Подумайте о расчете пересечения между двумя параллельными линиями.Или расчет массы фотона .
В этих случаях, когда вы используете в своем коде «математическую сторону жизни» (я могу себе представить, что это относится в основном к научному программному обеспечению), мы имеем следующую ситуацию:
- Они не являются ошибками , переменные имеют значения, которые им необходимы, вычисления выполнены, и это результат.К сожалению, не действительное число (может быть, сложное? Может быть, неопределенность, которая может быть решена с помощью других математических методов?), Тем не менее у вас есть ответ на расчет.
- Они не являются исключениями нет ничего плохого в вашем коде, это не аномальное условие, это ответ: «NaN» (где вы ожидаете 42?).Не нужно останавливать поток вашей программы здесь: сообщите пользователю, что расчет не имеет решения или он не определен, и пусть он будет доволен этим ( примечание: я немного вру, читаю последниепункт ).
Вы хотите, чтобы программа аварийно завершилась и тут же умерла, чтобы вы могли легко найти, где произошла ошибка.
Вы совершенно правы: вы все равно можете рассматривать это как исключение или как ошибку, если концепция NaN не является допустимым результатом в контексте вашей программы . Представьте себе расчет необходимого диаметра колонны для футбольного стадиона и получение NaN.Тьфу ... это было бы ошибкой, я хочу построить этот стадион, дай мне диаметр!Вы также совершенно не правы: пожалуйста, не говорите, что «легко» найдете, где все пошло не так, просто потому, что вы вызвали исключение после NaN.Я знал некоторых людей, отлаживающих метеорологические модели, которые хотели бы поговорить с вами (эти уравнения неинтересны).
В настоящее время у вас есть много библиотек и реализаций, которые принимают взвешенные решения относительно ошибок, исключений,и т. д. Дизайнеры IEEE оставили решение за вами.И языковые кодеры передали эту власть вам.Используйте это с умом.
И если вы прочтете до этого, позвольте мне сказать вам, что я немного лгал вам ради упрощения.Связанный IEEE определяет два вида NaN: тихие и сигнальные.Я говорил о тихих, хороших парнях. Сигнализаторы вызовут исключения в вашем программном обеспечении (переполнение, недостаточное заполнение и т. Д.).