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 por Double.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.

Foi útil?

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 NaNs 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 Onde x 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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top