Баланс nan что это означает
Баланс nan что это означает
NaN (англ. Not-a-Number ) — одно из особых состояний числа с плавающей запятой. В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом, или если в ячейку памяти попало не удовлетворяющее условиям число.
К операциям, приводящим к появлению NaN в качестве ответа, относятся:
Содержание
Свойства
См. также
Примечания
Ссылки
Полезное
Смотреть что такое «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 — /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 все еще может немного удивить
Сначала, я подумал, что это очередной вопрос из тех, которые могут задаваться на собеседовании. Наверное, если как следует пораскинуть мозгами, то можно догадаться до того, каким будет результат. Откинувшись на спинку кресла, начал размышлять, включать логику, вспоминать что-нибудь, на что можно опереться в рассуждениях. Но тщетно! Вдруг стало совершенно очевидно, что найти ответ не удается. Но почему? В чем нужно разбираться, чтобы он был найден? В математике? В языке программирования?
Ответ должен быть NaN. Но почему я не уверен в этом? Всю дорогу была уверенность в том, что любые выражения, содержащие NaN, вернут NaN. Ну разве что только если поделить NaN на ноль — в этом случае будет вызвано исключение ZeroDivisionError. Сто процентов NaN!
Ввожу выражение в ячейку блокнота:
В самом деле? Постойте:
То есть, по какой-то причине, единица в степени NaN — это единица, а вот ноль и все остальные числа в степени NaN — это NaN. Где логика? В чем дело?
Так, давайте еще раз:
Может быть я просто из-за отсутствия какой-то практической надобности в глубоких познаниях о NaN, просто о чем-то не подозревал? А может я знал, но забыл? А может еще хуже — я не знал и забыл?
Заходим на Википедию. Там данный вопрос тоже обозначен как проблема, но почему все именно так устроено, никак не объясняется. Зато узнал что:
Хотя, в то же время:
Что, согласитесь, тоже немного странно.
Ладно, с Википедии отправляемся в C99 на 182 страницу и наконец-то получаем логическое объяснение, почему pow(x, 0) возвращает 1 для любых x, даже для x равного NaN:
Если функция возводится в степень и при этом стремится к 0, то в результате получится 1, вне зависимости от того, какое значение имеет .
А если результат не зависит от числового значения функции , то 1 — является подходящим результатом, даже для NaN. Однако это по-прежнему не объясняет, почему 1 в степени NaN равна 1.
Отыскиваем еще один C99 и на 461 странице не видим никаких объяснений, просто требование того, что pow(+1, y) должно возвращать 1 для всех y, даже равных NaN. Все.
С другой стороны, объяснение, почему pow(NaN, 0)=1 является более предпочтительным, чем pow(NaN, 0)=NaN все-таки наталкивает на мысль о том, что NaN не стоит воспринимать буквально, как Not-a-Number. Допустим, в результате каких- то вычислений мы получили число, превышающее размер памяти, выделенный под данный тип чисел, например:
В результате мы получили inf, что именно это за число мы не знаем, но все же это какое-то число. Затем мы снова что-то вычислили и снова получили слишком большое число:
Разность a и b вернет NaN:
Единственная причина, по которой мы можем считать c не числом, заключается в том, что мы использовали недостаточно точные вычисления. Однако, в c под NaN все же скрывается какое-то значение. О том, что это за значение, мы не знаем. Но все же это число, а раз это число, то нет ничего удивительного в том, что pow(1, NaN)=1.
Почему же тогда pow(0, NaN)=NaN? Дело в том, что если возвести 0 в любую степень, то мы действительно получим ноль. Кроме одного единственного случая — когда степень равна 0:
Из-за чего в выражении pow(0, NaN) появляется неопределенность с конкретным значением NaN. Конечно, вероятность того, что под NaN может скрываться 0 — исчезающе мала и можно было бы принять, что pow(0, NaN)=0. Но все же лучше перестраховаться, мало ли к чему это может привести. Возможно, так и рассуждали, когда создавались стандарты.
Даже не знаю, что еще сказать… если вы заранее знали ответ, то скорее всего вам можно позавидовать, ведь сферы, где могут пригодиться такие познания, наверняка, переполнены интересными задачами. А может и наоборот. Напишите об этом в комментариях.
P.S. Поскольку NaN относится к числам с плавающей точкой, оно может быть ключом словаря:
Имеет ли смысл использовать такое на практике? Думаю, что лучше не стоит.
СОДЕРЖАНИЕ
Плавающая запятая
IEEE 754 NaN кодируются с полем экспоненты, заполненным единицами (например, значениями бесконечности), и некоторым ненулевым числом в поле значимости (чтобы сделать их отличными от значений бесконечности); это позволяет определять несколько различных значений NaN, в зависимости от того, какие биты установлены в значимом поле, а также от значения бита ведущего знака (но приложения не обязаны предоставлять четкую семантику для этих отдельных значений NaN).
Например, побитовое значение NaN IEEE 754 одинарной точности (32 бита) будет
Операции с плавающей точкой, отличные от упорядоченных сравнений, обычно передают тихий NaN ( qNaN ). Большинство операций с плавающей запятой в сигнальном NaN ( sNaN ) сигнализируют об исключительной ситуации недопустимой операции; тогда действие исключения по умолчанию такое же, как для операндов qNaN, и они производят qNaN, если производят результат с плавающей запятой.
Сравнение с NaN
Сравнение с NaN всегда возвращает неупорядоченный результат даже при сравнении с самим собой. Предикаты сравнения либо сигнализируют, либо не сигнализируют о тихих операндах NaN; версии сигнализации сигнализируют об исключительной ситуации недопустимой операции для таких сравнений. Предикаты равенства и неравенства не сигнализируют, поэтому x = x, возвращающий false, можно использовать для проверки, является ли x тихим NaN. Все другие стандартные предикаты сравнения сигнализируют о получении операнда NaN. Стандарт также предоставляет несигнальные версии этих других предикатов. Предикат определяет, является ли значение NaN, и никогда не сигнализирует об исключении, даже если x является сигнальным NaN. isNaN(x)
Сравнение | NaN ≥ x | NaN ≤ x | NaN> x | NaN Операции, генерирующие NaN Есть три типа операций, которые могут возвращать NaN: NaN не обязательно генерируются во всех вышеупомянутых случаях. Если операция может вызвать исключительную ситуацию и ловушки не замаскированы, тогда операция вызовет ловушку. Если операнд является тихим NaN, а также нет сигнального операнда NaN, тогда нет условия исключения и результатом является тихий NaN. Явные присвоения не вызовут исключения даже для сигнализации NaN. Тихий NaNТихие NaN, или qNaN, не вызывают никаких дополнительных исключений, поскольку они распространяются через большинство операций. Исключение составляют случаи, когда NaN нельзя просто передать в неизмененном виде на вывод, например, при преобразовании формата или некоторых операциях сравнения. Сигнализация NaNПри обнаружении обработчик прерывания может декодировать sNaN и вернуть индекс вычисленному результату. На практике такой подход сталкивается со многими сложностями. Обработка знакового бита NaN для некоторых простых операций (таких как абсолютное значение ) отличается от обработки для арифметических операций. Стандарт не требует ловушек. Есть и другие подходы к решению такого рода проблем, которые были бы более переносимыми. Операции с полезной нагрузкойОпределение функцииСуществуют разногласия по поводу правильного определения результата числовой функции, которая получает в качестве входных данных тихий NaN. Одна точка зрения состоит в том, что NaN должно распространяться на выход функции во всех случаях, чтобы распространять индикацию ошибки. Другой взгляд, принятый стандартами ISO C99 и IEEE 754-2008 в целом, заключается в том, что если функция имеет несколько аргументов и вывод однозначно определяется всеми входами, отличными от NaN (включая бесконечность), то это значение должно быть результатом. Так, например, значение, возвращаемое функцией hypot(±∞, qNaN) и, hypot(qNaN, ±∞) равно + ∞. Целое число NaNОтображатьРазличные операционные системы и языки программирования могут иметь разные строковые представления NaN. Поскольку на практике закодированные NaN имеют знак, бит молчания / сигнализации и необязательную «диагностическую информацию» (иногда называемую полезной нагрузкой ), они также иногда встречаются в строковых представлениях NaN. Вот несколько примеров: Не все языки допускают существование нескольких NaN. Например, ECMAScript использует только одно значение NaN. КодированиеПервый вариант предпочтительнее, поскольку он позволяет реализации заглушить сигнальный NaN, просто установив бит сигнализации / молчания в 1. Обратное невозможно с последним выбором, поскольку установка бита сигнализации / молчания в 0 может дать бесконечность. В редакциях стандарта IEEE 754 от 2008 и 2019 гг. Содержатся формальные требования и рекомендации по кодированию состояния сигнализации / молчания. Для соответствия IEEE 754-2008 значение бита сигнализации / молчания в последних процессорах MIPS теперь настраивается через поле NAN2008 регистра FCSR. Эта поддержка является необязательной в MIPS Release 3 и требуется в Release 5. Состояние / значение остальных битов значимого поля не определены стандартом. Это значение называется «полезной нагрузкой» NaN. Если операция имеет единственный вход NaN и распространяет его на выход, полезная нагрузка результата NaN должна быть полезной нагрузкой входного NaN (это не всегда возможно для двоичных форматов, когда состояние сигнализации / молчания кодируется is_signaling флагом, как объяснено выше. ). Если имеется несколько входов NaN, полезная нагрузка результата NaN должна быть из одного из входных NaN; в стандарте не указано, какие именно. Полезный NaNО NaN больше всего известно то, что он не равен самому себе. И что операции, невозможные арифметически, вернут NaN. Но у NaN есть одно мало известное(?), и, как мне кажется, весьма полезное применение. TL;DR Все дело в DateЧем полезно? Invalid Date все равно Date. И все операции с Date все ещё на месте. При этом, проверка на валидность даты становится проще некуда Заметьте, преобразование в timestamp здесь не требуется, valueOf() делает это под капотом. Все операции с Date — мутабельные. Тем не менее, клонирование через конструктор прекрасно работает и с Invalid Date. Сравнение двух дат напрямую в Date не реализовано и сравнивать даты можно только через timestamp. NaN гарантирует что Invalid Date точно не будет равно никакой другой дате. Думаю, это весьма полезное свойство. К моему сожалению, конструктор Date ведёт себя несколько странно по отношению к входному параметру. Было бы намного логичнее конструировать Invalid Date, ведь null — это не совсем ноль. Оставим это на совести Javascript-а. Однако, если насильственно передать в конструктор undefined, то результат выглядит ожидаемым. Так что будьте осторожны. Статья получилась больше о Date чем о NaN, но, в целом, именно об этой связке я хотел рассказать. Почему typeof NaN возвращает «число»?просто из любопытства. Это не кажется очень логичным, что typeof NaN номер. Прямо как NaN === NaN или возврат false. Является ли это одной из особенностей javascript, или для этого есть причина? Edit: спасибо за ваши ответы. Это не простая вещь, чтобы получить их голову вокруг, хотя. Чтение ответов и wiki я понял больше, но все же, предложение, как
просто голова кружится. Если кто-то может перевести это на человеческий (в отличие от, скажем, математического) читаемый язык, я был бы благодарен. 20 ответовЭто означает не число. Это не особенность javascript, а общий принцип информатики.
операции с NaN как минимум один операнд реальные операции со сложными результатами: все эти значения могут быть разными. Простой тест для NaN-это тест value == value ложно. Ну NaN еще числовое тип, несмотря на то, что на самом деле обозначает не число 🙂 конкретной NaN не считается равным другому NaN потому что они могут быть разные значения. Однако, NaN по-прежнему является типом номера, как 2718 или 31415. Что касается вашего обновленного вопроса, чтобы объяснить в терминах непрофессионала:
все это означает (разбито на части):
попытка выполнить сравнение (меньше, больше и т. д.) операций между NaN и другое число может либо привести к возникновению исключения (сигнализация), либо просто получить false в результате (без сигнализации или тихо).
стандарт ECMAScript (JavaScript) указывает, что Numbers are IEEE 754 поплавки, которые включают в себя NaN как возможное значение. ECMA 262 5e раздел 4.3.19: числовое значениепримитивное значение, соответствующее 64-разрядному двоичному формату двойной точности IEEE 754. ECMA 262 5e раздел 4.3.23: NaNчисловое значение, которое является IEEE 754 Значение «не-число». IEEE 754 Википедиистандарт IEEE для арифметики с плавающей запятой является техническим стандартом, установленным Институтом инженеров электротехники и электроники и наиболее широко используемым стандартом для вычисления с плавающей запятой [. ] typeof NaN возвращает ‘number’ потому что: спецификация ECMAScript говорит, что тип номера включает NaN: набор всех возможных числовых значений, включая специальное » Не-число» (NaN) значения, положительная бесконечность и отрицательная бесконечность так typeof возвращает соответственно: производства объект unaryexpression : typeof объект unaryexpression is оценивается следующим образом: примитивное значение, соответствующее 64-разрядному двоичному файлу двойной точности формат IEEE 754 значение числовое значение, которое является значением IEEE 754 «Not-a-Number» NaN-допустимое значение с плавающей запятой (http://en.wikipedia.org/wiki/NaN) и NaN === NaN ложно, потому что они не обязательно одно и то же число что касается typeof, это зависит от языка. И большинство языков скажут, что NaN-это float, double или number в зависимости от того, как они его классифицируют. Я не знаю языков, которые скажут, что это неизвестный тип или null. хотя его имена говорят, что это не число, тип данных, используемый для его хранения, является числовым типом. Итак, в JavaScript, запрашивая тип данных NaN вернутся number (as alert(typeof(NaN)) наглядно демонстрирует). Javascript использует NaN для представления всего, с чем он сталкивается, что не может быть представлено каким-либо другим способом его спецификациями. Это не значит, что это не число. Это самый простой способ описать встречу. NaN означает, что он или объект, который ссылается на него, не может быть представлен каким-либо другим способом javascript. Для всех практических целей она «неизвестна». Будучи «неизвестным», оно не может сказать вам, что оно такое, и даже если оно само есть. Это даже не тот объект, которому он назначен. Это может только сказать вам, что это не так, и не-ность или ничто может быть описано только математически на языке программирования. Поскольку математика связана с числами, javascript представляет ничто как NaN. Это не значит, что это не номер. Это значит, что мы не можем прочесть это по-другому. Вот почему он не может сравниться с самим собой. Потому что это не так.—1—> позорное неравенство NaN для себя и == и === является проявлением запутанного дизайна, заставляющего этот объект исключения быть примитивным типом. Это нарушает фундаментальный принцип, согласно которому примитив однозначно определяется его значением. Если NaN предпочтительнее рассматривать как исключение (из которых могут быть разные виды), тогда оно не должно «продаваться» как примитивное. И если это если хочешь быть примитивным, этот принцип должен соблюдаться. Пока он сломан, как у нас в JavaScript, и мы не можем действительно решить между ними, путаница, приводящая к ненужной когнитивной нагрузке для всех участников, останется. Что, впрочем, очень легко исправить, просто сделав выбор между двумя: и даже если «все так, как есть», ничто не мешает нам сделать это четкое различие для себя, чтобы помочь сделать наш код более предсказуемым и легко отлаживаемым. На практике это означает выявление эти исключения и обращение с ними как с исключениями. Что, к сожалению, означает больше кода, но, надеюсь, будет смягчено такими инструментами, как TypeScript Flowtype. и тогда у нас есть беспорядок тихий vs шумный ака сигнализация NaN различие. На самом деле речь идет о том, как обрабатываются исключения, а не сами исключения и ничем не отличаются от других исключений. Это просто потому, что NaN является свойством объекта Number в JS, оно не имеет ничего общего с тем, что это число.
|
---|