Почему эта логика
NaN
означает Not a Number
. Что не число? Что-нибудь. Вы можете иметь что-нибудь в одной стороне и что-нибудь в другой стороне, поэтому ничто не гарантирует, что оба они равны.NaN
рассчитывается с Double.longBitsToDouble(0x7ff8000000000000L)
и, как вы можете увидеть в документации longBitsToDouble
:
Если аргумент ссылается на любое значение в диапазоне 0x7ff0000000000001L
через 0x7fffffffffffffffL
или в диапазоне 0xfff0000000000001L
через 0xffffffffffffffffL
, результатом является NaN
.
Кроме того, NaN
логически обрабатывается внутри API.
Документация
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code double}. It is equivalent to the value returned by
* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
*/
public static final double NaN = 0.0d/0.0;
Кстати, NaN
является протестирован в качестве образца кода:
/**
* Returns {@code true} if the specified number is a
* Not-a-Number (NaN) value, {@code false} otherwise.
*
* @param v the value to be tested.
* @return {@code true} if the value of the argument is NaN;
* {@code false} otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
Решение
Что вы можете сделать, это использовать compare
/compareTo
:
Double.NaN
считается этим методом равным себе и больше, чем все остальные double
значений (в том числе Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Или equals
:
Если this
и argument
оба представляют Double.NaN
, то метод equals
возвращает true
, даже если Double.NaN==Double.NaN
имеет значение false
.
Double.NaN.equals(Double.NaN);
Это действительно странно. Поскольку Double.NaN является статическим окончательным, сравнение с == должно возвращать true. +1 для вопроса. – Stephan
То же самое верно в python: 'In [1]: NaN == NaN Out [1]: False' – tdc
То же самое верно на всех языках, которые правильно следуют стандарту IEEE 754. – zzzzBov