Что такое nan java
NaN в Яве
Поймите значение NaN – “не число” в Java.
1. Обзор
Проще говоря, Нан — это числовое значение типа данных, которое означает «не число».
В этом быстром учебнике мы объясним Нан значение в Java и различных операциях, которые могут производить или включать это значение.
2. Что такое Nan?
Нан обычно указывает на результат недействительных операций. Например, попытка разделить ноль на ноль является одной из таких операций.
IEEE Стандарт для плавающей точки арифметики (IEEE 754) определяет Нан ценность. В Java типы плавающих тоок поплавок и двойной реализовать этот стандарт.
” Постоянное проведение не-а-номер (NaN) значение типа двойной. Это эквивалентно стоимости, возвращенной Double.longBitsToDouble (0x7ff80000000000L) “.
“Постоянная проведение не-номер (NaN) значение типа поплавка. Это эквивалентно стоимости, возвращенной Float.intBitsToFloat (0x7fc00000)».
У нас нет такого типа констант для других типов числовых данных на Java.
3. Сравнение с NAN
При написании методов в Java, мы должны проверить, что вход действителен и в пределах ожидаемого диапазона. Нан значение не является действительным входным сигналом в большинстве случаев. Таким образом, мы должны убедиться, что входное значение не является Нан значение и обрабатывать эти значения ввода надлежащим образом.
Нан не может сравниться с любым плавающим значением типа. Это означает, что мы получим ложные для всех операций сравнения, связанных с Нан (за исключением “! “, за что мы получаем истинное ).
Мы получаем истинное для ” x” если и только если x это NaN:
Давайте посмотрим на результат работать код выше:
Следовательно, мы не можем проверить Нан сравнивая с Нан с помощью!” “ На самом деле, мы редко должны использовать!” ” операторы с поплавок или двойной Типы.
Мы также можем использовать методы Float.isNaN и Double.isNaN чтобы проверить эти значения . Это предпочтительный подход, поскольку он более читаемым и понятным:
При запуске этого кода мы получим следующий результат:
4. Операции по производству NaN
При выполнении операций с поплавок и двойной типов, мы должны быть осведомлены о Нан Значения.
Некоторые методы и операции с плавающей точкой Нан ценности вместо того, чтобы бросать исключение. Возможно, нам придется обращаться с такими результатами явно.
Общий случай, приводящий к значениям не-числа, математически неопределенные численные операции :
Эти примеры приводят к следующему выходу:
Числовые операции, которые не имеют результатов в реальных цифрах, также NaN:
Эти заявления приведут к:
Все числовные операции с Нан как оперная продукция Нан в результате:
Наконец, мы не можем назначить нулевой двойной или поплавок переменных типа. Вместо этого мы можем прямо назначить Нан к таким переменным, чтобы указать недостающие или неизвестные значения:
5. Заключение
В этой статье мы обсудили Нан и различные операции, связанные с ним. Мы также обсудили необходимость Нан при явном выполнении вычислений плавающей точки в Java.
In Java, what does NaN mean?
What does NaN mean in Java?
11 Answers 11
«NaN» stands for «not a number». «Nan» is produced if a floating point operation has some input parameters that cause the operation to produce some undefined result. For example, 0.0 divided by 0.0 is arithmetically undefined. Taking the square root of a negative number is also undefined.
NaN means “Not a Number” and is basically a representation of a special floating point value in the IEE 754 floating point standard. NaN generally means that the value is something that cannot be expressed with a valid floating point number.
A conversion will result in this value, when the value being converted is something else, for example when converting a string that does not represent a number.
NaN means «Not a Number» and is the result of undefined operations on floating point numbers like for example dividing zero by zero. (Note that while dividing a non-zero number by zero is also usually undefined in mathematics, it does not result in NaN but in positive or negative infinity).
Minimal runnable example
The first thing that you have to know, is that the concept of NaN is implemented directly on the CPU hardware.
All major modern CPUs seem to follow IEEE 754 which specifies floating point formats, and NaNs, which are just special float values, are part of that standard.
Therefore, the concept will be the very similar across any language, including Java which just emits floating point code directly to the CPU.
Before proceeding, you might want to first read up the following answers I’ve written:
So from this we learn a few things:
weird floating operations that don’t have any sensible result give NaN:
In C, it is actually possible to request signals to be raised on such operations with feenableexcept to detect them, but I don’t think it is exposed in Java: Why does integer division by zero 1/0 give error but floating point 1/0.0 returns «Inf»?
weird operations that are on the limit of either plus or minus infinity however do give +- infinity instead of NaN
0.0 almost falls in this category, but likely the problem is that it could either go to plus or minus infinity, so it was left as NaN.
if NaN is the input of a floating operation, the output also tends to be NaN
NaN and infinity have similar binary representation.
Let’s break down a few of them:
From this we confirm what IEEE754 specifies:
NaNs can be either positive or negative (top bit), although it this has no effect on normal operations
Tested in Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
Что означает NaN в Java?
Что NaN значит на Java?
«NaN» означает «не число». «Nan» создается, если операция с плавающей запятой имеет некоторые входные параметры, которые приводят к тому, что операция дает неопределенный результат. Например, 0,0, деленное на 0,0, арифметически не определено. Извлечение квадратного корня из отрицательного числа также не определено.
Преобразование приведет к получению этого значения, когда преобразуемое значение является чем-то другим, например, при преобразовании строки, которая не представляет собой число.
NaN означает «Не число» и является результатом неопределенных операций с числами с плавающей запятой, таких как, например, деление нуля на ноль. (Обратите внимание, что, хотя деление ненулевого числа на ноль также обычно не определяется в математике, это приводит не к NaN, а к положительной или отрицательной бесконечности).
NaN означает «Не число». Это специальное значение с плавающей запятой, которое означает, что результат операции не был определен или не может быть представлен в виде действительного числа.
Смотрите здесь для более подробного объяснения этого значения.
NaN означает не число. Он используется для обозначения любого значения, которое математически не определено. Как деление 0,0 на 0,0. Вы можете найти здесь дополнительную информацию: https://web.archive.org/web/20120819091816/http://www.concentric.net/
Разместите здесь свою программу, если вам нужна дополнительная помощь.
Значит не число. Это обычное представление невозможного числового значения во многих языках программирования.
Минимальный запускаемый пример
Первое, что вам нужно знать, это то, что концепция NaN реализована непосредственно на аппаратном обеспечении ЦП.
Все основные современные процессоры, похоже, следуют IEEE 754, который определяет форматы с плавающей запятой, а NaN, которые представляют собой просто специальные значения с плавающей запятой, являются частью этого стандарта.
Следовательно, концепция будет очень похожей для любого языка, включая Java, которая просто передает код с плавающей запятой непосредственно в ЦП.
Прежде чем продолжить, вы можете сначала прочитать следующие ответы, которые я написал:
Итак, из этого мы узнаем несколько вещей:
странные операции с плавающей запятой, не дающие разумного результата, дают NaN:
В C на самом деле можно запрашивать сигналы, которые должны генерироваться при таких операциях, feenableexcept для их обнаружения, но я не думаю, что это доступно в Java: почему целочисленное деление на ноль 1/0 дает ошибку, а с плавающей запятой 1 / 0.0 возвращает «Инф»?
0.0 почти попадает в эту категорию, но, скорее всего, проблема в том, что он может переходить в плюс или минус бесконечность, поэтому он был оставлен как NaN.
если NaN является входом плавающей операции, выход также имеет тенденцию быть NaN
NaN и бесконечность имеют одинаковое двоичное представление.
Разберем несколько из них:
Исходя из этого, мы подтверждаем, что указывает IEEE754:
NaN могут быть как положительными, так и отрицательными (верхний бит), хотя это не влияет на нормальные операции.
Протестировано в Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
NaN, Infinity
Сегодня я расскажу тебе еще про несколько интересных вещей в Java.
Бесконечность.
В Java тип double имеет специальные значения для понятий «плюс бесконечность» и «минус бесконечность». Положительное число, разделенное на 0.0, дает «плюс бесконечность», а отрицательное – «минус бесконечность».
Этим понятиям соответствуют специальные константы типа Double:
Код | Описание |
---|---|
плюс бесконечность | |
минус бесконечность |
— И что, это действительно работает?
— Действительно работает. А если у нас получается неопределенность? Например, если мы из бесконечность вычитаем бесконечность?
— Для этого в Java есть еще одно понятие – NaN – Not-a-Number (не число).
Его используют в различных ситуациях:
1) Строку конвертируем в число, а в ней есть буквы. Ответ – NaN
2) Бесконечность минус бесконечность. Ответ — NaN
3) Многие другие ситуации, где в ответе ждут число, а получается неизвестно что.
— А какие операции можно производить с Infinity и NaN?
— С NaN все очень просто. Любая операция, где есть NaN, дает в результате NaN.
NaN в Java
1. Обзор
В этом кратком руководстве мы объясним значение NaN в Java и различные операции, которые могут создавать или задействовать это значение.
« Константа, содержащая значение Not-a-Number (NaN) типа double. Это эквивалентно значению, возвращаемому Double.longBitsToDouble (0x7ff8000000000000L) ».
«Константа, содержащая не-числовое (NaN) значение типа float. Это эквивалентно значению, возвращаемому Float.intBitsToFloat (0x7fc00000) ».
У нас нет этого типа констант для других числовых типов данных в Java.
3. Сравнение с NaN
При написании методов на Java мы должны проверять, что ввод действителен и находится в ожидаемом диапазоне. В большинстве случаев значение NaN не является допустимым вводом. Следовательно, мы должны убедиться, что входное значение не является значением NaN, и правильно обработать эти входные значения.
NaN нельзя сравнивать ни с одним значением плавающего типа. Это означает, что мы получим false для всех операций сравнения с NaN (кроме «! =», Для которого мы получаем true ).
Мы получаем истину для « x! = X» тогда и только тогда, когда x равен NaN:
Давайте посмотрим на результат выполнения приведенного выше кода:
Вместо этого мы можем использовать выражение « x! = х » . Это выражение возвращает истину только для NAN.
Мы также можем использовать методы Float.isNaN и Double.isNaN для проверки этих значений . Это предпочтительный подход, поскольку он более читабелен и понятен:
При запуске этого кода мы получим следующий результат:
4. Операции, производящие NaN
Некоторые методы и операции с плавающей запятой производят значения NaN вместо выдачи исключения. Нам может потребоваться явная обработка таких результатов.
Обычным случаем, приводящим к не- числовым значениям, являются математически неопределенные числовые операции :
Эти примеры приводят к следующему результату:
Числовые операции, которые не приводят к действительным числам, также дают NaN:
Эти утверждения приведут к:
Все числовые операции с NaN в качестве операнда в результате дают NaN :
И результат вышеизложенного:
Наконец, мы не можем назначить нуль для двойного или поплавковых переменного типа. Вместо этого мы можем явно назначить NaN таким переменным, чтобы указать отсутствующие или неизвестные значения:
5. Заключение
В этой статье мы обсудили NaN и различные операции с ним. Мы также обсудили необходимость обработки NaN при явном выполнении вычислений с плавающей запятой в Java.