Согласно Википедии:
Существует три вида операций, которые возвращают NaN
:
- Операции с
NaN
как минимум одним операндом
- неопределенные формы
- Деления 0/0, ∞ / ∞, ∞ / −∞, −∞ / ∞ и −∞ / −∞
- Умножения 0 × ∞ и 0 × −∞
- Мощность 1 ∞
- Сложения ∞ + (−∞), (−∞) + ∞ и эквивалентные вычитания.
- Реальные операции со сложными результатами:
- квадратный корень из отрицательного числа
- Логарифм отрицательного числа
- Тангенс нечетного кратного 90 градусов (или π / 2 радиан)
- Обратный синус или косинус числа, которое меньше -1 или больше + 1.
Этот фрагмент Java-кода иллюстрирует все вышеперечисленное, кроме касательного (я подозреваю, из-за ограниченной точности double
):
import java.util.*;
import static java.lang.Double.NaN;
import static java.lang.Double.POSITIVE_INFINITY;
import static java.lang.Double.NEGATIVE_INFINITY;
public class NaN {
public static void main(String args[]) {
double[] allNaNs = {
0D/0D,
POSITIVE_INFINITY / POSITIVE_INFINITY,
POSITIVE_INFINITY / NEGATIVE_INFINITY,
NEGATIVE_INFINITY / POSITIVE_INFINITY,
NEGATIVE_INFINITY / NEGATIVE_INFINITY,
0 * POSITIVE_INFINITY,
0 * NEGATIVE_INFINITY,
Math.pow(1, POSITIVE_INFINITY),
POSITIVE_INFINITY + NEGATIVE_INFINITY,
NEGATIVE_INFINITY + POSITIVE_INFINITY,
POSITIVE_INFINITY - POSITIVE_INFINITY,
NEGATIVE_INFINITY - NEGATIVE_INFINITY,
Math.sqrt(-1),
Math.log(-1),
Math.asin(-2),
Math.acos(+2),
};
System.out.println(Arrays.toString(allNaNs));
// prints "[NaN, NaN...]"
System.out.println(NaN == NaN); // prints "false"
System.out.println(Double.isNaN(NaN)); // prints "true"
}
}
Ссылки
- Википедия / NaN
- JLS 15.21.1 Операторы числового равенства == и! =
Если любой из операндов равен NaN
, то результат ==
равен false
, а результат !=
равен true
. Действительно, тест x!=x
равен true
тогда и только тогда, когда значение x
равно NaN
. (Методы Float.isNaN
и Double.isNaN
также могут использоваться для проверки, является ли значение NaN
.)