Если вы спрашиваете, "что хорошего в NaN?" на Java (или на любом другом языке) я могу дать вам пример использования, где это очень удобно: когда у меня есть двумерный массив с плавающей запятой, но мои вычисления не имеют значимого значения для некоторой части этого двумерного массива, Я заполню это значение "NaN". Это можно использовать, чтобы сигнализировать последующим пользователям о моих вычислениях (например, когда они превращаются в растровое изображение) «не обращайте внимания на значение в этот момент». Очень полезно!
Dan H
Кстати, что - точно - значит "сжать" дубль? Любопытно ...
«NaN» означает «не число». "Nan" создается, если операция с плавающей запятой имеет некоторые входные параметры, которые приводят к тому, что операция дает неопределенный результат. Например, 0,0, деленное на 0,0, арифметически не определено. Извлечение квадратного корня из отрицательного числа также не определено.
Кроме того, NaN определено Стандартом IEEE для арифметики с плавающей точкой (IEEE 754) довольно явно, которому Java слепо следует. Чтение стандарта открывает вам глаза на множество вещей, в том числе множественные нулевые значения.
Esko
37
Кроме того, он NaNобладает интересным свойством быть единственным «числом», которое при сравнении отличается от него самого. Поэтому общее (и во многих языках только) тест , если число xявляется NaNзаключается в следующем:boolean isNaN(x){return x != x;}
quazgar
3
Ссылка в ответ мертва?
Pang
3
... "Извлечение квадратного корня из отрицательного числа не определено (в арифметике)" ... Это не так! это на самом деле, iи некоторые языки, такие как python, очень хорошо с этим справляются ... Это может быть не так в javaтебе
Рафаэль Т
5
@RafaelT Я бы сказал, что это не определено в несложной арифметике. В Java нет способа присвоить комплексное число float или double. Python динамически типизирован, поэтому в этом случае может быть просто возвращать комплексное число.
sstn
19
NaNозначает «Не число» и в основном представляет собой представление специального значения с плавающей запятой в стандарте с плавающей запятой IEE 754 . NaN обычно означает, что значение не может быть выражено действительным числом с плавающей запятой.
Преобразование приведет к получению этого значения, когда преобразуемое значение является чем-то другим, например, при преобразовании строки, которая не представляет собой число.
Как преобразовать? С parseFloat()или parseDouble? Или что-то другое?
Алонсо дель Арте,
14
NaNозначает «Не число» и является результатом неопределенных операций с числами с плавающей запятой, таких как, например, деление нуля на ноль. (Обратите внимание, что, хотя деление ненулевого числа на ноль также обычно не определяется в математике, это приводит не к NaN, а к положительной или отрицательной бесконечности).
NaNозначает «Не число». Это специальное значение с плавающей запятой, которое означает, что результат операции не был определен или не может быть представлен в виде действительного числа.
Смотрите здесь для более подробного объяснения этого значения.
Первое, что вам нужно знать, это то, что концепция NaN реализована непосредственно на аппаратном обеспечении ЦП.
Все основные современные процессоры, похоже, следуют IEEE 754, который определяет форматы с плавающей запятой, а NaN, которые представляют собой просто специальные значения с плавающей запятой, являются частью этого стандарта.
Следовательно, концепция будет очень похожей для любого языка, включая Java, которая просто передает код с плавающей запятой непосредственно в ЦП.
Прежде чем продолжить, вы можете сначала прочитать следующие ответы, которые я написал:
странные операции, которые находятся на границе плюс или минус бесконечности, но дают + - бесконечность вместо NaN
1.0f / 0.0f
log(0.0f)
0.0 почти попадает в эту категорию, но, скорее всего, проблема в том, что он может переходить в плюс или минус бесконечность, поэтому он был оставлен как NaN.
если NaN является входом плавающей операции, выход также имеет тенденцию быть NaN
Есть несколько возможных значений для NaN 0x7fc00000, 0x7fc00001, 0x7fc00002, хотя x86_64 , кажется, генерировать только0x7fc00000 .
NaN и бесконечность имеют одинаковое двоичное представление.
Не специалист по Java, но в JS и других языках я использую это «Не число», что означает, что какая-то операция заставила его стать недействительным числом.
Я не согласен с этим ответом. Во-первых: «NaN» - это допустимое значение для числа с плавающей запятой IEEE! (В конце концов, он определен в спецификации ... так что он «действителен», не так ли?). Во-вторых: «деление на ноль» может быть представлено IEEE «Положительная бесконечность» или «отрицательная бесконечность»; лучший пример «NaN» - «ноль, деленный на ноль», как правильно указали некоторые другие ответы.
Dan H
«Действительное значение» и «определено в спецификации» - это не одно и то же. Согласовано с 0/0.
Ответы:
Взято с этой страницы :
источник
NaN
обладает интересным свойством быть единственным «числом», которое при сравнении отличается от него самого. Поэтому общее (и во многих языках только) тест , если числоx
являетсяNaN
заключается в следующем:boolean isNaN(x){return x != x;}
i
и некоторые языки, такие как python, очень хорошо с этим справляются ... Это может быть не так вjava
тебеNaN
означает «Не число» и в основном представляет собой представление специального значения с плавающей запятой в стандарте с плавающей запятой IEE 754 . NaN обычно означает, что значение не может быть выражено действительным числом с плавающей запятой.Преобразование приведет к получению этого значения, когда преобразуемое значение является чем-то другим, например, при преобразовании строки, которая не представляет собой число.
источник
parseFloat()
илиparseDouble
? Или что-то другое?NaN
означает «Не число» и является результатом неопределенных операций с числами с плавающей запятой, таких как, например, деление нуля на ноль. (Обратите внимание, что, хотя деление ненулевого числа на ноль также обычно не определяется в математике, это приводит не к NaN, а к положительной или отрицательной бесконечности).источник
NaN
означает «Не число». Это специальное значение с плавающей запятой, которое означает, что результат операции не был определен или не может быть представлен в виде действительного числа.Смотрите здесь для более подробного объяснения этого значения.
источник
NaN означает не число. Он используется для обозначения любого значения, которое математически не определено. Как деление 0,0 на 0,0. Вы можете найти здесь дополнительную информацию: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Разместите здесь свою программу, если вам нужна дополнительная помощь.
источник
NaN = не число.
источник
Значит не число. Это обычное представление невозможного числового значения во многих языках программирования.
источник
Минимальный запускаемый пример
Первое, что вам нужно знать, это то, что концепция NaN реализована непосредственно на аппаратном обеспечении ЦП.
Все основные современные процессоры, похоже, следуют IEEE 754, который определяет форматы с плавающей запятой, а NaN, которые представляют собой просто специальные значения с плавающей запятой, являются частью этого стандарта.
Следовательно, концепция будет очень похожей для любого языка, включая Java, которая просто передает код с плавающей запятой непосредственно в ЦП.
Прежде чем продолжить, вы можете сначала прочитать следующие ответы, которые я написал:
Теперь немного о Java. Большинство интересующих функций, которых нет в основном языке, живут внутри
java.lang.Float
.Nan.java
GitHub вверх по течению .
Бежать с:
Вывод:
Итак, из этого мы узнаем несколько вещей:
странные операции с плавающей запятой, не дающие разумного результата, дают NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
создать
NaN
.В C на самом деле можно запрашивать сигналы, которые должны генерироваться при таких операциях,
feenableexcept
для их обнаружения, но я не думаю, что это доступно в Java: почему целочисленное деление на ноль 1/0 дает ошибку, а с плавающей запятой 1 / 0.0 возвращает "Инф"?странные операции, которые находятся на границе плюс или минус бесконечности, но дают + - бесконечность вместо NaN
1.0f / 0.0f
log(0.0f)
0.0
почти попадает в эту категорию, но, скорее всего, проблема в том, что он может переходить в плюс или минус бесконечность, поэтому он был оставлен как NaN.если NaN является входом плавающей операции, выход также имеет тенденцию быть NaN
Есть несколько возможных значений для NaN
0x7fc00000
,0x7fc00001
,0x7fc00002
, хотя x86_64 , кажется, генерировать только0x7fc00000
.NaN и бесконечность имеют одинаковое двоичное представление.
Разберем несколько из них:
Исходя из этого, мы подтверждаем, что указывает IEEE754:
NaN могут быть как положительными, так и отрицательными (верхний бит), хотя это не влияет на нормальные операции.
Протестировано в Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
источник
Не специалист по Java, но в JS и других языках я использую это «Не число», что означает, что какая-то операция заставила его стать недействительным числом.
источник
Это буквально означает «не число». Я подозреваю, что что-то не так с вашим процессом преобразования.
Ознакомьтесь с разделом Not A Number по этой ссылке.
источник
Недействительное значение с плавающей запятой (например, результат деления на ноль)
http://en.wikipedia.org/wiki/NaN
источник