Quali sono gli altri valori NAN?
-
23-09-2019 - |
Domanda
Il documentazione per java.lang.Double.NaN
dice che lo è
Una costante che detiene un valore di tipo non-a-numero (NAN)
double
. È equivalente al valore restituito daDouble.longBitsToDouble(0x7ff8000000000000L)
.
Questo sembra implicare che ci siano altri. In tal caso, come posso afferrarli e questo può essere fatto in porta?
Per essere chiari, vorrei trovare il double
i valori x
tale che
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
e
Double.isNaN(x)
sono entrambi veri.
Soluzione
Hai bisogno doubleToRawLongBits
piuttosto che doubleToLongBits
.
doubleToRawLongBits
estrae la rappresentazione binaria effettiva. doubleToLongBits
no, converte tutto NaN
s al valore predefinito NaN
primo.
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));
produzione:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Altri suggerimenti
Java usa IEEE 754 per i suoi numeri di punta mobile e quindi segue le loro regole.
Secondo il Pagina Wikipedia su Nan è definito in questo modo:
Un esempio un po 'di una singola precisione standard a punto mobile IEEE:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
dovex
significa Non importa.
Quindi ci sono parecchi pattern che lo sono NaN
i valori.
IEEE 754 definisce un NAN come un numero con tutti i bit esponenti che sono 1
e un numero non zero nella mantissa.
Quindi per un numero di precisione singola che stai cercando:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java gestisce questo così:
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
Per somma, puoi usare qualsiasi NAN che desideri che sia conforme alle regole sopra menzionate (tutti i bit 1 in esponente e mantissa! = 0).