Was sind die anderen NAN -Werte?
-
23-09-2019 - |
Frage
Das Dokumentation für java.lang.Double.NaN
sagt, dass es ist
Eine konstante Haltung eines Na-Number-Wertes (Number) des Typs
double
. Es entspricht dem Wert, der von zurückgegeben wirdDouble.longBitsToDouble(0x7ff8000000000000L)
.
Dies scheint zu implizieren, dass es andere gibt. Wenn ja, wie bekomme ich sie und kann dies Portal erledigt werden?
Um klar zu sein, würde ich das gerne finden double
Werte x
so dass
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
und
Double.isNaN(x)
sind beide wahr.
Lösung
Du brauchst doubleToRawLongBits
statt doubleToLongBits
.
doubleToRawLongBits
extrahiert die tatsächliche binäre Darstellung. doubleToLongBits
Nicht, es konvertiert alle NaN
s zum Standard NaN
Erste.
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));
Ausgang:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Andere Tipps
Java verwendet IEEE 754 für seine schwebenden Punktzahlen und folgt daher ihren Regeln.
Laut dem Wikipedia -Seite auf Nan Es ist so definiert:
Ein bitteres Beispiel für eine IEEE-Floating-Punkt-Standard-Einzelgenauigkeitsnan:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
wox
meint egal.
Es gibt also einige Bit-Musters, die alle sind NaN
Werte.
IEEE 754 definiert eine Nan als Zahl mit allen Exponentenbits, die sind 1
und eine Nicht -Null -Zahl in der Mantissa.
Für eine einzelne Prezisionsnummer suchen Sie also:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java behandelt das wie so:
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
Zusammenfassend können Sie jede NAN verwenden, die Sie möchten, die den oben genannten Regeln entspricht (alle Bits 1 in Exponent und Mantissa! = 0).