Что такое nan
NaN (англ. Not-a-Number ) — одно из особых состояний числа с плавающей запятой. В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом, или если в ячейку памяти попало не удовлетворяющее условиям число.
К операциям, приводящим к появлению NaN в качестве ответа, относятся:
- все математические операции, содержащие NaN в качестве одного из операндов;
- деление ноля на ноль;
- деление бесконечности на бесконечность;
- умножение ноля на бесконечность;
- сложение бесконечности с бесконечностью противоположного знака;
- вычисление квадратного корня отрицательного числа [1] ;
- логарифмирование отрицательного числа.
Содержание
Свойства
- NaN не равен ни одному другому значению (даже самому себе [2] ); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
- Любая нетривиальная операция, принимающая NaN как аргумент, всегда возвращает NaN вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции max и min, которые возвращают значение «второго» аргумента (отличного от NaN).
- Тривиальные операции, являющиеся тождеством, обрабатываются особо: так, например, 1 NaN равно 1.
См. также
Примечания
- ↑ в случае, если библиотека, выполняющая эту операцию, не поддерживает либо не настроена на использование комплексных чисел
- ↑ поскольку операции сравнения проходят через библиотечные функции, которые обычно проверяют состояние числа с плавающей запятой
Ссылки
- Арифметика с плавающей запятой
Wikimedia Foundation . 2010 .
Полезное
Смотреть что такое «NaN» в других словарях:
NaN — NaN, proviene del acrónimo en inglés Not a Number (en español: no es un número). Este acrónimo se usa generalmente en algunos lenguajes de programación para expresar un resultado imposible de calcular, como el caso de las raíces negativas,… … Wikipedia Español
Nan — or NAN may refer to one of the following. Contents 1 Acronyms 2 Places 3 People … Wikipedia
NAN — bezeichnet: eine Stadt im Norden von Thailand, siehe Nan den gleichnamigen Fluss (Maenam Nan), siehe Nan (Fluss) die gleichnamige Provinz, siehe Nan (Provinz) den Kreis Nan (chin. 南县 Nán Xiàn) der chinesischen Provinz Hunan, siehe Nan (Yiyang)… … Deutsch Wikipedia
NaN — (« Not a Number », en français « pas un nombre ») est, en informatique, une valeur ou un symbole produit par le résultat d une opération arithmétique invalide, plus spécialement dans les calculs utilisant la virgule flottante … Wikipédia en Français
Nan — … Deutsch Wikipedia
NaN — (engl. Not a Number) bedeutet keine Zahl . Es handelt sich hierbei um einen speziellen Wert bestimmter Darstellungen von Gleitkommazahlen auf dem Rechner, der als Ergebnis einer ungültigen Rechenoperation zurückgegeben wird. Insbesondere haben… … Deutsch Wikipedia
Nan — /nan/, n. 1. a word formerly used in communications to represent the letter N. 2. a female given name. * * * (as used in expressions) Hai nan Ho nan Huai nan tzu Hu nan Chi nan Nan ch ang Nan ching Nan ning Yün nan T ai nan * * * ▪ Thailand… … Universalium
Nan-ao — 南澳鄉 Staat: Republik China Koordinaten … Deutsch Wikipedia
Nan’yō — shi 南陽市 Geographische Lage in Japan … Deutsch Wikipedia
Nan’an — ist mehrdeutig. Es bezeichnet: die kreisfreie Stadt Nan an (南安市) der bezirksfreien Stadt Quanzhou in der chinesischen Provinz Fujian, siehe Nan an (Quanzhou); den Stadtbezirk Nan an (南岸区 Nan an Qū) der chinesischen regierungsunmittelbaren Stadt… … Deutsch Wikipedia
Почему NaN это не «Not a Number»?
При разработке ПО очень важно быть точным при использовании терминов, ведь если все разработчики понимают термины одинаково, то эффективность коммуникации между ними будет высокой. Это как быть с человеком «на одной волне» и «понимать с полуслова».
Один из таких терминов, который часто используется не к месту и без понимания — NaN (Not a Number). Дословно — «нечисло».
Все уходит корнями в «бородатый» стандарт IEEE754-1985 и его преемника IEEE754-2008 , там NaN определяется как «особое значение» (множество значений, как мы покажем далее), представляющее собой результат некоторого вычисления, которое не может или не должно быть представлено как конкретное число или такое значение просто неопределено в математическом смысле. Например, arcsin(2) или 0/0 . Это также приводит нас к другому открытию: NaN на самом деле числовой тип! Просто это число, которое используется и представляется в некой особоой форме.
Итак, еще раз, по стандарту, NaN это НЕ произвольное значение НЕчислового типа, а число! Это значит, нельзя сказать, что строка «строка» это NaN , так как NaN это на самом деле число.
Все становится еще интереснее, если проверить, а как же представлено NaN в памяти компьютера.
У чисел с плавающей точкой двойной (64 бита) точности (как тип Number в JS) для представления NaN ‘ов используется специальный ДИАПАЗОН значений.
А именно: числа (мн.ч.), показатель степени которых равен 0x 7FF (hex) или 11111111111 (bin) (11 бит), отведены для представления NaN значений.
Рассмотрим рис. 1.
Сейчас все биты равны 0 , cледовательно все число равно 0 или 0.0 * 10 0 , это тот самый 0 , который нам всем привычен.
А теперь покажем, что такое NaN . Для этого, как мы уже упоминали, поставим все биты показателя степени в 1 (рис. 2)
Теперь запишем это число в шестнадцатеричной системе — 0x_ 7FF _0000000000000 . Дамы и господа, перед вами «нечисло» с точки зрения IEEE754 .
Более того, остальные 64 — 11 = 53 бита могуть быть любыми, за исключением полностью нулевой мантиссы, которая зарезервирована для представления +Бесконечность при первом знаковом бите равном 0 и -Бесконечность при знаковом бите равным 1 — число будет NaN в любом случае.
Скажем, на рис. 3 по-прежнему NaN
Запишем это число в шестнадцатеричной системе — 0x _7FF _B000000000000 .
Путем нехитрых комбинаторных расчетов получим, что у чисел с плавающей точкой двойной точности мы имеем (по IEEE754 ) 2 53 — 2 чисел, которые будут NaN по стандарту IEEE754 . Многовато, не правда ли?
Таким образом, если вы используете NaN как замену для всего, что «нечисло» (строки, значение типа null, объекты и т.д.) — не делайте так. Если нет — поделитесь знанием и помогите остальным быть такими же точными как числа двойной точности как вы.
NaN в JavaScript
Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:
Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):
Курс «Frontend-разработчик»
— Научитесь верстать сайты для всех типов устройств.
— Сможете использовать JavaScript для работы в браузере.
— 77 часов теории, 346 часов практики.
— Выполните 5 масштабных проектов для портфолио.
— Помощь с поиском работы или стажировки.
Курс «Fullstack-разработчик на JavaScript»
— Научитесь программировать на JavaScript и TypeScript.
— Cможете самостоятельно создавать сайты и веб-приложения.
— Освоите передовые технологии — React, Node.js, Docker, Express.js, Nest.js, Firebase, MongoDB.
— Выполните 9 масштабных проектов для портфолио
— Помощь с поиском работы или стажировки.
Backend-разработка на Node.js
— Node.js позволит вам разрабатывать backend для веб-приложений самостоятельно.
— Изучив Node.js, frontend-разработчики становятся fullstack-разработчиками.
— 40 часов теории, 184 часа практики.
— 120 000 рублей средняя зарплата Node.js-разработчика.
— Помощь с поиском работы или стажировки.
Хотя непосредственная работа с NaN редко встречается, оно может неожиданно появиться после неудачной операции с числами.
Давайте подробно рассмотрим специальное значение NaN: как проверить, содержит ли переменная NaN, и сценарии, которые в которых генерируется значения «не число».
1. Число NaN
Тип числа в JavaScript — это набор всех числовых значений, включая «не число», положительную бесконечность и отрицательную бесконечность.
«Not A Number» можно получить с помощью специального выражения NaN или как свойство глобального объекта или функции Number:
«Не число» — это значение, которое не представляет действительное число, несмотря на то, что оно имеет тип числа. Через NaN полезно представлять ошибочные операции с числами. Например, умножение числа на undefined не является допустимой операцией, поэтому дает NaN:
Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:
2. Проверка на равенство с NaN
Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:
Это поведение полезно для определения, является ли переменная NaN:
Выражение someNumber !== someNumber равно true, только если someNumber является NaN. Таким образом, приведенный выше фрагмент регистрирует в консоли «Is NaN». JavaScript содержит встроенные функции для определения NaN: isNaN() и Number.isNaN():
Разница между этими функциями заключается в том, что Number.isNaN() не преобразуется свой аргумент в число:
isNaN(‘Joker12’) преобразует аргумент ‘Joker12’ в число, которое является NaN. Таким образом, функция возвращает true.
С другой стороны, Number.isNaN(‘Joker12’) проверяет аргумент без преобразования. Функция возвращает false, потому ‘Joker12’ не равно NaN.
3. Операции, дающие NaN
3.1 Парсинг чисел
В JavaScript вы можете преобразовать числовые строки в числа. Например, вы можете легко преобразовать строку ‘1.5’ в число с плавающей запятой 1.5:
Когда строка не может быть преобразована в число, функция синтаксического анализа возвращает NaN: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:
При парсинге чисел рекомендуется проверить, не является ли результат парсинга NaN:
Парсинг inputToParse не удался, поэтому parseInt(inputToParse, 10) возвращается NaN. Условие if (isNaN(number)) оценивается, как true, и 0 назначается number.
3.2 undefined в качестве операнда
При использовании undefined в качестве операнда в арифметических операциях, таких как сложение, умножение и т д. мы получаем NaN. Например:
getFontSize() — это функция, которая обращается к свойству fontSize из объекта стиля. При вызове getFontSize(< size: 16 >) результатом будкт undefined (свойство fontSize не существует в объекте < size: 16 >). fontSize * 2 оценивается как undefined * 2, что дает NaN.
«Not A Number» генерируется, когда в качестве значения в арифметических операциях используется отсутствующее свойство или функция, возвращающая undefined. Отсутствие undefined в арифметических операциях — это хороший способ предотвратить получение NaN.
3.3 NaN как операнд
Значение NaN также генерируется, когда операндом в арифметических операциях является NaN:
NaN распространяется на арифметические операции:
Операции с переменной result прерываются после добавления к result значения invalidNumber (которое является NaN).
3.4 Неопределенные формы
Значение NaN создается, когда арифметические операции имеют неопределенные формы. Деление 0 / 0 и Inifinity / Infinity:
Умножение 0 и Infinity:
Сложение бесконечных чисел с разными знаками:
3.5 Неверные аргументы математических функций
Квадратный корень из отрицательного числа:
Или логарифм отрицательного числа:
4. Заключение
Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).
Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.
Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.
Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»
Уровень 30. Ответы на вопросы к собеседованию по теме уровня
NaN (англ. Not-a-Number) — одно из особых состояний числа с плавающей запятой. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом, или если в ячейку памяти попало не удовлетворяющее условиям число.
В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение 11…11, а мантиссы — во что угодно, кроме 0 (зарезервированное значение для машинной бесконечности). Знак и мантисса могут нести какую-то дополнительную информацию: многие библиотеки «отрицательный» NaN выводят как -NaN.
К операциям, приводящим к появлению NaN в качестве ответа, относятся:
- все математические операции, содержащие NaN в качестве одного из операндов;
- деление нуля на нуль;
- деление бесконечности на бесконечность;
- умножение нуля на бесконечность;
- сложение бесконечности с бесконечностью противоположного знака;
- вычисление квадратного корня отрицательного числа[1];
- логарифмирование отрицательного числа.
В некоторых языках программирования есть «тихий» и «сигнальный» NaN: первый, попав в любую операцию, возвращает NaN, второй — вызывает аварийную ситуацию. Обычно «тихий» или «сигнальный» определяется старшим битом мантиссы.
NaN не равен ни одному другому значению (даже самому себе[2]); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
Поведение других операций сравнения зависит от языка. Одни языки дают ложь[3] (так что a a по-разному ведут себя с NaN), другие — выбрасывают аварию даже для «тихого» NaN.
Любая нетривиальная операция, принимающая «тихий» NaN как аргумент, всегда возвращает NaN вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции max и min, которые возвращают значение «второго» аргумента (отличного от NaN). Тривиальные операции, являющиеся тождеством, обрабатываются особо: так, например, 1NaN равно 1.
Как получить бесконечность в Java?
В Java тип double имеет специальные значения для понятий «плюс бесконечность» и «минус бесконечность». Положительное число, разделенное на 0.0, дает «плюс бесконечность», а отрицательное – «минус бесконечность». Этим понятиям соответствуют специальные константы типа Double :
Код | Описание |
---|---|
public static final double POSITIVE_INFINITY = 1.0 / 0.0; | плюс бесконечность |
public static final double NEGATIVE_INFINITY = -1.0 / 0.0; | минус бесконечность |
- Строку конвертируем в число, а в ней есть буквы. Ответ — NaN
- Бесконечность минус бесконечность. Ответ — NaN
- Многие другие ситуации, где в ответе ждут число, а получается неизвестно что.
Любая операция, где есть NaN, дает в результате NaN.
Действия с бесконечностью: | |
---|---|
Выражение | Результат |
n ÷ ±Infinity | 0 |
±Infinity × ±Infinity | ±Infinity |
±(не ноль) ÷ | ±Infinity |
Infinity + Infinity | Infinity |
±0 ÷ ±0 | NaN |
Infinity — Infinity | NaN |
±Infinity ÷ ±Infinity | NaN |
±Infinity × 0 | NaN |
Как проверить, что в результате вычисления получилась бесконечность?
Все сводится к выводу System.out.println()
Что такое битовая маска?
Битовая маска — это когда хранится много различных логических значений (true/false) в виде одного целого числа. При этом каждому boolean-значению соответствует определенный бит.
Где применяют битовые маски?
В основном там, где надо компактно хранить много информации об объектах. Когда хранишь много информации об объекте, всегда наберется пара десятков логических переменных. Вот их всех удобно хранить в одном числе. Именно хранить. Т.к. пользоваться им в работе не так уж удобно.
Как установить бит в единицу в битовой маске?
Опираясь на лекции можно ответить таким кодом:
Здесь использовал метод Integer.toBinaryString() , дабы проверить себя, а вдруг)
Вывод такой:
Как установить бит в ноль в битовой маске?
Вывод:
Я взял число 15, так как на нем более наглядно видно, куда устанавливается 0.
Как получить значение определенного бита в битовой маске?
Вывод:
C 0 все понятно, на том месте и вправду 0. А переменная d возвращает значение запрашиваемого бита (в 10-ой системе).
Что такое ленивое вычисление выражения?
Это ленивые вычисления (lazy evaluation). В ленивых вычислениях ни один параметр не вычисляется, пока в нем нет необходимости. Программы фактически начинаются с конца и работают от конца к началу. Программа вычисляет, что должно быть возвращено, и продолжает движение назад, чтобы определить, какое значение для этого требуется. В сущности каждая функция вызывается с promise’ами для каждого параметра. Когда для вычисления необходимо значение, тогда выполняется promise. Поскольку код выполняется только тогда, когда необходимо значение, это называется вызов по необходимости (call-by-need). В традиционных языках программирования вместо promise’ов передаются значения, это называется вызов по значению(call-by-value).
Технология программирования «вызов по необходимости» имеет ряд преимуществ. Потоки имплементируются автоматически. Ненужные значения никогда не вычисляются. Однако, поведение ленивых программ часто трудно предсказать. В программах типа «вызов по значению» порядок вычисления довольно предсказуем, поэтому любые time- или sequence-based вычисления относительно легко имплемнтировать. В ленивых языках, где специальные конструкции, например, monads, необходимы для описания явно упорядоченных событий, это намного труднее. Все это также делает связь с другими языками более трудной.
Существуют языки программирования, например, Haskell и Clean, использующие ленивое программирование по умолчанию. Кроме того, для некоторых языков, таких как Scheme, ML и другие, существуют ленивые версии.
Иногда, откладывая вычисления до тех пор, пока не понадобится их значение, вы можете оптимизировать скорость выполнения программы или реструктурировать программу в более понятную форму. Несмотря на свою ценность, методы ленивого программирования не слишком широко используются или даже не очень известны. Подумайте о том, чтобы добавить их в ваш арсенал.
Чем отличается использование && и & для типа boolean ?
&& — это логическое «и». (В этом случае имеют место ленивые вычисления: некоторые вычисления опускаются, когда результат и так ясен)
& — это побитовое «и» (Если применить этот оператор к переменным типа Boolean, то ленивых вычислений происходить не будет)