2016-03-22 21 views
37

Wie verstehe ich java es einen Schwimmer im Speicher als 32-Bit-Ganzzahl mit den folgenden Eigenschaften gespeichert werden:Wie werden NaN und Infinity eines Float oder Double im Speicher gespeichert?

  • Das erste Bit wird verwendet, um das Vorzeichen
  • die nächsten 8 Bits den Exponenten
  • repräsentieren, um zu bestimmen
  • Die letzten 23 Bits werden verwendet, um die Fraktion zu speichern

Dies keine Reserve-Bits für die drei Sonderfälle lässt:

  • NaN
  • Positive Unendlichkeit
  • Negative Unendlichkeit

Ich kann mir denken, dass negative 0 verwendet werden könnte, eine von diesen zu speichern.

Wie werden diese tatsächlich im Speicher dargestellt?

+10

Es ist in der konstanten Beschreibung geschrieben '0xfff0000000000000L = -Infinity',' 0x7ff0000000000000L = + Infinity' und '0x7ff8000000000000L = NaN'. (Das sind die Werte für Doppel) – SomeJavaGuy

+7

es ist in der Javadoc – wero

+0

dokumentiert Negative Null existiert eigentlich auch als eine separate Sache. – harold

Antwort

52

Java gibt an, dass Fließkommazahlen dem IEEE 754 Standard entsprechen.Diese

ist, wie es gespeichert:

  • Bit 0: Vorzeichenbit
  • Bits 1 bis 11: Exponent
  • Bits 12-63: Fraktion

Jetzt habe ich ausgeführt unter Methode mit verschiedenen Doppelwerten:

public static void print(double d){ 
    System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d))); 
} 

ich mit diesen Werten ausgeführt:

print(Double.NaN); 
print(Double.NEGATIVE_INFINITY); 
print(Double.POSITIVE_INFINITY); 
print(-Double.MAX_VALUE); 
print(Double.MAX_VALUE); 

Und bekam die folgende Ausgabe für die Werte oben (formatiert für Lesbarkeit):

NaN: 0111111111111000000000000000000000000000000000000000000000000000 
-Inf: 1111111111110000000000000000000000000000000000000000000000000000 
+Inf: 0111111111110000000000000000000000000000000000000000000000000000 
-Max: 1111111111101111111111111111111111111111111111111111111111111111 
+Max: 0111111111101111111111111111111111111111111111111111111111111111 

Wikipedia explains, dass, wenn der Exponent Feld ist all-Bits-1, die Nummer ist entweder Inf oder NaN. Inf hat alle Bits der Mantisse Null; NaN hat mindestens ein Bit in der Mantisse, das auf 1 gesetzt ist. Das Vorzeichenbit behält seine normale Bedeutung für Inf bei, ist aber für NaN nicht sinnvoll. Javas Double.NaN ist ein bestimmter Wert, der als NaN interpretiert wird, aber andere 3.

+3

Bitte schreiben Sie entweder die tatsächliche Ausgabe, die Sie von Ihrem Code erhalten haben - was, wie es aussieht, niemals Text ausgibt, nur binär - oder aktualisieren Sie Ihren Code, um zu drucken, was Sie sagen, dass es tut. Auch, weil es schwierig ist, schnell zu vergleichen, wie es steht, richten Sie bitte die Zahlen aus. –

+0

Sie schaffen es immer noch nicht, die Ausgabe zu vergleichen - was der Code, den Sie gerade geben, tun würde. Schreiben Sie die tatsächliche Ausgabe dieses Codes oder fügen Sie Code ein, der die von Ihnen ausgegebene Ausgabe generiert. –

+1

Wie ich bereits sagte, sind der Code und die formatierte Ausgabe selbsterklärend. Was ich versage, ist, den obigen Kommentar zu verstehen. Wenn Sie eine bestimmte Frage haben, können Sie sie als neue Frage zu SO stellen und ich werde Ihnen gerne antworten. Prost. –

5

Wie in Wikipedia beschrieben, wird der Exponent mit allen auf 1 gesetzten Bits zur Identifizierung dieser Zahlen verwendet. Das auf 0 gesetzte Bruchteilfeld wird verwendet, um Unendlichkeit (positiv oder negativ, wie durch das Vorzeichen identifiziert) zu identifizieren, und ein Nicht-Null-Bruchteilfeld identifiziert einen NaN-Wert.

17

Von here:

Frage: Wie sind Null, Unendlich und NaN repräsentiert 754 IEEE verwendet?

A. Durch Einstellen der Exponent alle Bits auf 1 positiv Unendlich = 0x7ff0000000000000 (alle Exponentenbits 1 Vorzeichenbit 0 und allen Mantissen Bits 0), negativ Unendlich = 0xfff0000000000000 (alle Exponentenbits 1, Vorzeichenbit 1 und alle Mantissenbits 0), NaN = 0x7ff8000000000000 (alle Exponentenbits 1, mindestens ein gesetztes Mantissenbit). Positive Null = alle Bits 0 Negative Null = alle Bits 0, außer Vorzeichenbit, das ist 1.

auch die Javadocs über NAN, Positive Infinity and Negative Infinity beziehen.

+8

Dies bedeutet auch, dass es mehrere NaNs geben kann, die voneinander unterschieden werden können (obwohl sie alle NaN sind). Einige Anwendungen verwenden das, um zusätzliche Informationen über die Art der Nicht-Nummer zu speichern. – Joey

3

Java verwendet IEEE 754 Fließkommazahl.

meisten Zahlen werden in einem Zeichen-Exponent Mantisse-Format ausgedrückt mit der Mantisse eine implizite führende 1.

den Extremwerten des Exponenten (nur Nullen und nur Einsen) Feld nicht als normale Exponent Werte verwendet werden . Stattdessen werden sie verwendet, um Sonderfälle darzustellen.

Alle Nullen im Exponentenfeld werden verwendet, um Zahlen darzustellen (einschließlich positiver und negativer Null), die zu klein sind, um im normalen Format darzustellen.

Alle im Exponenent angegebenen Werte werden verwendet, um spezielle Werte darzustellen. Wenn alle Bits in der Mantisse Null sind, dann ist der Wert plus oder minus unendlich (das Vorzeichen wird durch das Vorzeichenbit angezeigt). Ansonsten ist der Wert NaN.

0

Zuerst müssen wir lernen, wie die Zahl als Float Point und Double im Speicher dargestellt wird.

Die allgemeine Nummer hat die Form: 1.M * 2^e.

(wo die M Mantisse und die E genannt wird, ist der Exponent in dem Überschuss-127)

In Gleitkommazahl

Das MSB (Most Significant Bit) wird als Vorzeichenbit verwendet, und die Bitnummer von 23 bis 31 wird für den Exponentialwert in Form von Überschuß 127 verwendet, und die Bitnummer von 0 bis 30 wird zum Speichern der Mantisse verwendet.

In Doppel

das MSB (Most Significant Bit) wird als Vorzeichenbit und die Bitnummer 52 bis 63 verwendet, für den exponentiellen Wert in Form von überschüssigen-127 verwendet wird, und die Bitanzahl von 0 bis wird zum Speichern der Mantisse verwendet.

so jetzt sind wir in der Lage, die NaN, Infinity-Darstellung im Float oder Double zu verstehen.

NaN (Nicht ein Number)

In der Darstellung des NaN alle Exponent Bits 1 und die Mantisse Bits alles sein kann und es keine Rolle spielt, dass es in float oder dezimal ist.

Unendlich

In der Darstellung der Unendlichkeit aller Exponentenbits sind 1 und die Mantisse Bits 0 sind, und es keine Rolle spielt, dass es in Schwimmers oder Dezimalzahl ist. Die positive Unendlichkeit ist nur durch gleiche darstellen wie oben, aber der Vorzeichen-Bit 0 und die negative Unendlichkeit auch durch gleiche gerade dargestellt wird, aber der Vorzeichen-Bit ist hier 1.