Por que essa lógica
NaN
meios Not a Number
. O que não é um número? Qualquer coisa. Você pode ter qualquer coisa de um lado e qualquer coisa do outro lado; portanto, nada garante que ambos sejam iguais. NaN
é calculado com Double.longBitsToDouble(0x7ff8000000000000L)
e como você pode ver na documentação de longBitsToDouble
:
Se o argumento for qualquer valor no intervalo 0x7ff0000000000001L
através
0x7fffffffffffffffL
ou no intervalo 0xfff0000000000001L
através
0xffffffffffffffffL
, o resultado é um NaN
.
Além disso, NaN
é tratado logicamente dentro da API.
Documentação
/**
* 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;
A propósito, NaN
é testado como seu exemplo de código:
/**
* 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);
}
Solução
O que você pode fazer é usar compare
/ compareTo
:
Double.NaN
é considerado por esse método igual a si mesmo e maior que todos os outros double
valores (inclusive
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Ou equals
:
Se this
e argument
ambos representam Double.NaN
, o equals
método retorna true
, mesmo que
Double.NaN==Double.NaN
tenha o valor false
.
Double.NaN.equals(Double.NaN);