NaN это не «не число»
При разработке программного обеспечения очень важно быть точным в использовании терминов: корректное использование необходимо для эффективной коммуникации между разработчиками. Очень важно быть на одной волне.
Один из терминов, который очень часто используют неправильно,— это NaN .
Его корни лежат в стандарте IEEE754, он определяет NaN как специальное значение (на самом деле, как мы увидим далее, множество значений), которое используется если результат вычисления не может или не должен быть представлен как конкретное число, или попросту неизвестен. Например: asin(2) или 0/0. Это приводит нас к следующему открытию: NaN — на самом деле значение числового типа! Просто это специальное число, которое представлено по-особенному.
Итак, NaN , согласно стандарту IEEE754, не какое-то значение не числового типа, но в действительности — число. А это значит, что не совсем корректно говорить, что строка «foo» является NaN , ибо на самом деле это не так.
Всё становится ещё более интересным если мы посмотрим, как значение NaN представлено внутри. У чисел с плавающей запятой двойной точности (64 бит), которые используются для представления значений типа Number в JavaScript и некоторых других языках, специальный диапазон значений, у которых экспонента равна значению 0x7FF (11 бит), выделен для представления числа NaN . А это значит, что оставшиеся 53 бита могут принимать произвольные значения (исключая значения с мантиссой равной нулю, ибо эти значения зарезервированы для двух других специальных значений: +Infinity и -Infinity ). Итого, для чисел с плавающей запятой двойной точности мы можем сконструировать значение NaN 9007199254740990 (2^53 — 3) разными способами. Это довольно-таки много.
Подводя итог: если вы используете термин NaN как синоним, обозначающий «что угодно, что не является числом» (строка, значение null , объект, и т.д.), пожалуйста, прекратите. А если вы уже знаете что к чему, то расскажите об этом остальным, что бы они могли выражать свои мысли так же точно, как это делаете вы.
Материалы для дальнейшего изучения:
- http://www.binaryconvert.com/ — калькулятор, который позволяет конвертировать числа разных форматов в бинарное представление и обратно
- Число с плавающей точкой стандарта IEEE
- Формат чисел с плавающей запятой одинарной точности
- Формат чисел с плавающей запятой двойной точности
© 2013 Frontender Magazine
Кроме материалов, опубликованных под лицензией Creative Commons
Nan что значит
Глобальное свойство NaN является значением, представляющим не-число (Not-A-Number).
| Атрибуты свойства NaN | |
|---|---|
| Записываемое | нет |
| Перечисляемое | нет |
| Настраиваемое | нет |
Интерактивный пример
Описание
NaN является свойством глобального объекта.
Начальным значением NaN является Not-A-Number (не-число) — то же самое значение, что и у Number.NaN . В современных браузерах NaN является ненастраиваемым и незаписываемым свойством. Даже когда это не так, избегайте его переопределения.
В программах NaN используется довольно редко. Это возвращаемое значение в ситуациях, когда математические ( Math ) функции не срабатывают должным образом (например, при вызове Math.sqrt(-1) ) или когда функция, пытающаяся считать число из строки, терпит неудачу по причине того, что в строке не число ( parseInt(‘blabla’) ).
Проверка на равенство NaN
NaN является неравным (посредством сравнения через == , != , === , and !== ) любому другому значению, включая другое значение NaN. Используйте Number.isNaN() или isNaN() , чтобы наиболее понятным образом определить является ли значение значением NaN. Или выполните само-сравнение: NaN, и только NaN, в результате такого сравнения будет неравным самому себе.
NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true function valueIsNaN(v) return v !== v; > valueIsNaN(1); // false valueIsNaN(NaN); // true valueIsNaN(Number.NaN); // true
Тем не менее, обратите внимание на разницу между функцией isNaN() и методом Number.isNaN() : первая вернёт true , если значение в настоящий момент является NaN , или если оно станет NaN после того, как преобразуется в число, в то время как последний вернёт true , только если текущим значением является NaN :
isNaN("hello world"); // true Number.isNaN("hello world"); // false
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-value-properties-of-the-global-object-nan |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
JavaScript: NaN
Некоторые операции с бесконечностями приводят к странному результату, например, деление бесконечности на бесконечность. В математике такая операция не имеет никакого числового эквивалента. В JavaScript вернется NaN .
Infinity / Infinity; // NaN
NaN — специальное значение «не число», которое обычно говорит о том, что была выполнена бессмысленная операция. Результатом практически любой операции, в которой участвует NaN , будет NaN .
NaN + 1; // NaN
NaN интересное значение, хотя оно обозначает «не число» — с точки зрения типов, оно является числом. Парадокс. NaN никогда не является желаемым значением и появляется только в результате ошибок. Если вы его встретили, то нужно отследить момент, в котором выполнилась операция, недопустимая для чисел, и поправить это место.
Задание
Выполните операцию, которая приводит к NaN, и распечатайте её результат на экран с помощью console.log() .
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Nan что значит
NaN (англ. Not-a-Number ) — одно из особых состояний числа с плавающей запятой. В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом, или если в ячейку памяти попало не удовлетворяющее условиям число.
К операциям, приводящим к появлению NaN в качестве ответа, относятся:
- все математические операции, содержащие NaN в качестве одного из операндов;
- деление ноля на ноль;
- деление бесконечности на бесконечность;
- умножение ноля на бесконечность;
- сложение бесконечности с бесконечностью противоположного знака;
- вычисление квадратного корня отрицательного числа [1] ;
- логарифмирование отрицательного числа.
Свойства
- NaN не равен ни одному другому значению (даже самому себе [2] ); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
- Любая нетривиальная операция, принимающая NaN как аргумент, всегда возвращает NaN вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции max и min, которые возвращают значение «второго» аргумента (отличного от NaN).
- Тривиальные операции, являющиеся тождеством, обрабатываются особо: так, например, 1 NaN равно 1.
См. также
- NULL (Си)
- Плавающая запятая
- Вещественное число
Примечания
- ↑ в случае, если библиотека, выполняющая эту операцию, не поддерживает либо не настроена на использование комплексных чисел
- ↑ поскольку операции сравнения проходят через библиотечные функции, которые обычно проверяют состояние числа с плавающей запятой
Ссылки
- Арифметика с плавающей запятой
Wikimedia Foundation . 2010 .