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

War es hilfreich?

Lösung

Du brauchst doubleToRawLongBits statt doubleToLongBits.

doubleToRawLongBits extrahiert die tatsächliche binäre Darstellung. doubleToLongBits Nicht, es konvertiert alle NaNs 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 wo x 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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top