Рубрики
Без рубрики

NaN в Яве

Поймите значение NaN – “не число” в Java.

Автор оригинала: baeldung.

1. Обзор

Проще говоря, Нан — это числовое значение типа данных, которое означает «не число».

В этом быстром учебнике мы объясним Нан значение в Java и различных операциях, которые могут производить или включать это значение.

2. Что такое Nan?

Нан обычно указывает на результат недействительных операций. Например, попытка разделить ноль на ноль является одной из таких операций.

Мы также используем Нан для непредставимых ценностей. Квадратный корень -1 является одним из таких случаев, так как мы можем описать значение ( i ) только в сложных числах.

IEEE Стандарт для плавающей точки арифметики (IEEE 754) определяет Нан ценность. В Java типы плавающих тоок поплавок и двойной реализовать этот стандарт.

Java определяет Нан константы обоих поплавок и двойной типы как Поплавок . Нан и Double.NaN :

Постоянное проведение не-а-номер (NaN) значение типа двойной. Это эквивалентно стоимости, возвращенной Double.longBitsToDouble (0x7ff80000000000L) “.

и:

“Постоянная проведение не-номер (NaN) значение типа поплавка. Это эквивалентно стоимости, возвращенной Float.intBitsToFloat (0x7fc00000)».

У нас нет такого типа констант для других типов числовых данных на Java.

3. Сравнение с NAN

При написании методов в Java, мы должны проверить, что вход действителен и в пределах ожидаемого диапазона. Нан значение не является действительным входным сигналом в большинстве случаев. Таким образом, мы должны убедиться, что входное значение не является Нан значение и обрабатывать эти значения ввода надлежащим образом.

Нан не может сравниться с любым плавающим значением типа. Это означает, что мы получим ложные для всех операций сравнения, связанных с Нан (за исключением “! “, за что мы получаем истинное ).

Мы получаем истинное для ” x” если и только если x это NaN:

System.out.println("NaN == 1 = " + (NAN == 1));
System.out.println("NaN > 1 = " + (NAN > 1));
System.out.println("NaN < 1 = " + (NAN < 1));
System.out.println("NaN != 1 = " + (NAN != 1));
System.out.println("NaN == NaN = " + (NAN == NAN));
System.out.println("NaN > NaN = " + (NAN > NAN));
System.out.println("NaN < NaN = " + (NAN < NAN));
System.out.println("NaN != NaN = " + (NAN != NAN));

Давайте посмотрим на результат работать код выше:

NaN == 1 = false
NaN > 1 = false
NaN < 1 = false
NaN != 1 = true
NaN == NaN = false
NaN > NaN = false
NaN < NaN = false
NaN != NaN = true

Следовательно, мы не можем проверить Нан сравнивая с Нан с помощью!” “ На самом деле, мы редко должны использовать!” ” операторы с поплавок или двойной Типы.

Вместо этого мы можем использовать выражение ” x ! х” . Это выражение возвращается верно только для НАН.

Мы также можем использовать методы Float.isNaN и Double.isNaN чтобы проверить эти значения . Это предпочтительный подход, поскольку он более читаемым и понятным:

double x = 1;
System.out.println(x + " is NaN = " + (x != x));
System.out.println(x + " is NaN = " + (Double.isNaN(x)));
        
x = Double.NaN;
System.out.println(x + " is NaN = " + (x != x));
System.out.println(x + " is NaN = " + (Double.isNaN(x)));

При запуске этого кода мы получим следующий результат:

1.0 is NaN = false
1.0 is NaN = false
NaN is NaN = true
NaN is NaN = true

4. Операции по производству NaN

При выполнении операций с поплавок и двойной типов, мы должны быть осведомлены о Нан Значения.

Некоторые методы и операции с плавающей точкой Нан ценности вместо того, чтобы бросать исключение. Возможно, нам придется обращаться с такими результатами явно.

Общий случай, приводящий к значениям не-числа, математически неопределенные численные операции :

double ZERO = 0;
System.out.println("ZERO / ZERO = " + (ZERO / ZERO));
System.out.println("INFINITY - INFINITY = " + 
  (Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY));
System.out.println("INFINITY * ZERO = " + (Double.POSITIVE_INFINITY * ZERO));

Эти примеры приводят к следующему выходу:

ZERO / ZERO = NaN
INFINITY - INFINITY = NaN
INFINITY * ZERO = NaN

Числовые операции, которые не имеют результатов в реальных цифрах, также NaN:

System.out.println("SQUARE ROOT OF -1 = " + Math.sqrt(-1));
System.out.println("LOG OF -1 = " +  Math.log(-1));

Эти заявления приведут к:

SQUARE ROOT OF -1 = NaN
LOG OF -1 = NaN

Все числовные операции с Нан как оперная продукция Нан в результате:

System.out.println("2 + NaN = " +  (2 + Double.NaN));
System.out.println("2 - NaN = " +  (2 - Double.NaN));
System.out.println("2 * NaN = " +  (2 * Double.NaN));
System.out.println("2 / NaN = " +  (2 / Double.NaN));

И результат выше:

2 + NaN = NaN
2 - NaN = NaN
2 * NaN = NaN
2 / NaN = NaN

Наконец, мы не можем назначить нулевой двойной или поплавок переменных типа. Вместо этого мы можем прямо назначить Нан к таким переменным, чтобы указать недостающие или неизвестные значения:

double maxValue = Double.NaN;

5. Заключение

В этой статье мы обсудили Нан и различные операции, связанные с ним. Мы также обсудили необходимость Нан при явном выполнении вычислений плавающей точки в Java.

Полный исходный код можно найти более на GitHub .