Бесконечность не является числом в любой стандартной математике, которая заставила бы думать выражение
Double.isNaN(Double.POSITIVE_INFINITY)
следует оценить true
, Тем не менее, быстрый тест показывает, что он оценивает false
, Более внимательный взгляд на спецификацию функции подтверждает мои подозрения: «isNaN» не следует интерпретировать как «не число», а как «значение не числа».
У меня вопрос, почему они реализовали это как таковой? Почему они не реализовали это таким образом, что это также вернуло бы false
для положительной или отрицательной бесконечности?
На практике я сейчас использую (Double.isNaN(x) || Double.isInfinite(x))
гораздо чаще, чем я использую только Double.isNaN(x)
, Поэтому было бы лучше использовать Double.isNaN(x)
а также (Double.isNaN(x) && !Double.isInfinite(x))
соответственно вместо.
Даже если изменить его сейчас было бы непонятно, не лучше ли было бы реализовать и объяснить функцию так, как я здесь описал?
Какие другие соображения играют здесь роль?
PS: пожалуйста, опустите любое замечание о законе исключенного среднего. 😉
У доктора Уильяма Кахана есть множество статей, объясняющих его мысли за решения в IEEE-754.
Я предлагаю вам прочитать его работы, чтобы понять аргументацию. Он был одной из главных сил, стоящих за IEEE-754, поэтому лучше всего получить ответ изо рта лошади.
Кстати, в техническом смысле +/- Inf — это числа в аффинно расширенная система вещественных чисел. Таким образом, только по этой причине я ожидаю, что isNaN вернет false на бесконечности.
Ты смотришь за isFinite
функция, которая возвращает false
на бесконечности и NaN. Было бы странно вызывать эту функцию или ее отрицание в соответствии с isNaN
по понятным причинам (хорошая практика — избегать ненужных отрицаний в именах, чтобы isnotanumber
функция, о которой вы думаете, будет лучше названа isanumber
, Эта функция существует и называется isFinite
).
Вы ошибаетесь. Если вы посмотрите на продвинутую математику, бесконечность обычно рассматривается как число. Например, в комплексном анализе это обычно 1 + 0i (в зависимости от выбранной проекции это может быть другое значение). То есть совершенно разумно, что IEEE 754 определил бесконечность no как NaN. NaN используется, когда математические выражения не определены, например, для бесконечности раз 0.