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

È stato utile?

Soluzione

Hai bisogno doubleToRawLongBits piuttosto che doubleToLongBits.

doubleToRawLongBits estrae la rappresentazione binaria effettiva. doubleToLongBits no, converte tutto NaNs 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 dove x 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top