2015-08-03 14 views
6

ich von der Bedeutung von „Gesamtgröße“ in der Spezifikation der Java-Sprache stapfte bin:Bedeutung von „Gesamtgröße“ einer Reihe

Widening primitive Konvertierungen nicht verlieren Informationen über die Gesamtgröße eines numerischen Wert.

Ist es "Größenordnung" oder "Absolutwert"? Oder etwas anderes?

+1

Die Art, wie ich es sehe, bedeutet im Grunde "die abstrakte konzeptionelle Wert" im Gegensatz zu der tatsächlichen Sequenz von Bits, die verwendet wird, um den Wert darzustellen. Übrigens, "float-> double" -Umwandlung ** behält ** die Gesamtgröße nicht bei. – biziclop

+0

@biziclop - nicht wenn es 'strictfp' ist - dann sollte es überhaupt keine Informationen verlieren:" * float to double in einem 'strictfp' Ausdruck (§15.4), verliert überhaupt keine Information, der numerische Wert ist genau erhalten. * " –

+0

@AndyBrown Ja. Es ist einfach so, wie dies in der JLS ausgedrückt wird, ist ein bisschen komisch: zuerst stellen sie fest, dass es nicht passiert, dann fünf Absätze später fügen sie einen Vorbehalt hinzu, ähm ... tatsächlich, ohne 'strictfp' passiert es. – biziclop

Antwort

3

vom Wikipedia-Artikel, Magnitude (mathematics):

In der Mathematik ist Größe die Größe eines mathematischen Objekt, eine Eigenschaft, durch die das Objekt als größer oder kleiner als andere Gegenstände der gleichen Art verglichen werden können.

In einfachem Englisch ist die Größe von 32767 32767. Die Größe entspricht dem Wert der Zahl.

In der JLS-Spezifikation, ich denke, sie verwenden Größe, um die Anzahl der Ziffern in der Zahl zu bedeuten. 32767 ist die größte Ganzzahl, die in ein vorzeichenbehaftetes 16-Bit-Feld passen kann. Wenn Sie 32767 in ein Bitfeld mit weniger als 15 Bits verschieben, ist die Nummer nicht mehr 32767. Das nennt man Verengung. Wenn Sie 32767 in ein Bitfeld mit mehr als 15 Bits (oder 16 Bits, signiert) verschieben, wird der Wert von 32767 beibehalten. Das nennt man Erweiterung.

Eine Größenordnung ist die Addition oder Subtraktion einer Ziffer von der Zahl. Zum Beispiel, Basis 10 Zahlen verwendet wird, ist 32767 eine Größenordnung höher als 3276. 3276 ist eine Größenordnung höher ist als 327.

+0

Dies scheint zu widersprechen die Art und Weise verwendet "Größe" Zitat in Die Frage: Durch die mathematische Definition könnte eine sich ausbreitende Konvertierung von Float zu Long die Größe ändern, da die Nachkommastellen bei der Konvertierung verloren gehen könnten –

+0

Leider entspricht die Größenordnung, über die sie in der JLS sprechen, nicht genau dieser Definition. Es ist nah, aber nicht ganz. – biziclop

+0

@Julian Eigentlich habe ich es anders herum: long-> float ist eine Erweiterung Umwandlung, die Präzision verlieren kann. – biziclop

1

Okay, hier ist ein weiterer Versuch einer formalen Definition.

Wenn f(x) eine Verbreiterung Umwandlung für jeden x <= y dann ist, f(x) <= f(y). Mit anderen Worten, erweiternde Konvertierungen bewahren eine partielle Ordnung der Werte.

Das ist, was nicht verlieren Informationen über die Gesamtgröße könnte bedeuten.

Verlust der Präzision in diesem Rahmen bedeutet, dass für einige x < y, f(x) = f(y).


Das einzige Problem mit dieser Definition ist der (float)Double.MAX_VALUE Überlauf resultierenden Float.POSITIVE_INFINITY, die die oben genannten Kriterien erfüllen technisch aber nicht wirklich sollte keine Informationen über die Gesamtgröße zu verlieren zählen.

+0

Sollte das letzte Bit "f (x)

+0

@Julian Nein, da ein Verlust der Genauigkeit bedeutet, dass einige nahe gelegene Werte in denselben Wert konvertiert werden. – biziclop