Quais são os outros valores da NAN?
-
23-09-2019 - |
Pergunta
o documentação para java.lang.Double.NaN
diz que é
Uma constante segurando um valor não-número (NAN) do tipo
double
. É equivalente ao valor retornado porDouble.longBitsToDouble(0x7ff8000000000000L)
.
Isso parece sugerir que existem outros. Em caso afirmativo, como faço para me apossar deles, e isso pode ser feito portavelmente?
Para ficar claro, gostaria de encontrar o double
valores x
de tal modo que
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
e
Double.isNaN(x)
ambos são verdadeiros.
Solução
Você precisa doubleToRawLongBits
ao invés de doubleToLongBits
.
doubleToRawLongBits
Extrai a representação binária real. doubleToLongBits
Não, ele converte a todos NaN
s para o padrão NaN
primeiro.
double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));
resultado:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Outras dicas
Java usa IEEE 754 por seus números de ponto flutuante e, portanto, segue suas regras.
De acordo com Página da Wikipedia na NAN é definido assim:
Um exemplo um pouco em termos de uma nan de precisão única de ponto flutuante IEEE: NAN de precisão:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
Ondex
significa Não se importe.
Portanto, existem alguns padrões de bits todos os quais são NaN
valores.
IEEE 754 define uma nan como um número com todos os bits de expoente que são 1
e um número não zero na Mantissa.
Então, para um número de precisão única que você está procurando:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java lida com isso assim:
Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true
Para resumir, você pode usar qualquer NAN que você deseja que esteja em conformidade com as regras acima mencionadas (todos os bits 1 em expoente e Mantissa! = 0).