Um den Wertebereich und die Berechnungsgenauigkeit von float und double zu verstehen, müssen Sie zuerst verstehen, wie Dezimalzahlen im Computer gespeichert werden:
Zum Beispiel: 78.375 ist eine positive Dezimalzahl. Um diese Zahl in einem Computer zu speichern, muss sie im Gleitkommaformat dargestellt werden. Führe zuerst die Binärumwandlung durch:
PS: Der binäre Dezimalpunkt unterscheidet sich vom Dezimalpunkt. Nach dem binären Dezimalpunkt stehen negative Zweierpotenzen; nach dem Dezimalpunkt stehen negative Zehnerpotenzen.
1. Binärumwandlung von Dezimalzahlen (Gleitkommazahlen)
Der ganzzahlige Teil von 78.375:
Der Bruchteil:
Die Binärform von 78.375 ist also 1001110.011
Dann, unter Verwendung vonbinärer wissenschaftlicher Notation,erhalten wir
Beachten Sie, dass die in binärer wissenschaftlicher Notation dargestellte Zahl nach der Umwandlung eine Basis, einen Exponenten und einen Bruchteil hat. Dies nennt manGleitkommazahl.
2. Speicherung von Gleitkommazahlen in Computern
In Computern verwendet das Speichern dieser Zahl die Gleitkommadarstellung, die in drei Hauptteile unterteilt ist:
Der erste Teil wird verwendet, um dasVorzeichenbit zu speichern,das dazu dient, positive von negativen Zahlen zu unterscheiden. Hier ist es 0, was eine positive Zahl anzeigt.
Der zweite Teil wird verwendet, um denExponenten zu speichern,hier ist der Exponent 6 im Dezimalsystem.
Der dritte Teil wird verwendet, um dieMantisse zu speichern,hier ist der Bruchteil 001110011.
Beachte, dass der Exponent auch positiv oder negativ sein kann; dies wird später besprochen.Wie in der folgenden Abbildung dargestellt:

Zum Beispiel ist der Typ float 32 Bit groß und verwendet eine Gleitkommadarstellung mit einfacher Genauigkeit:
Das Vorzeichenbit belegt 1 Bit und wird verwendet, um positive und negative Zahlen darzustellen.
Die Exponentenbits belegen 8 Bit und werden verwendet, um den Exponenten darzustellen.
Die Mantissenbits belegen 23 Bit und werden verwendet, um die Mantisse darzustellen, wobei zu wenige Bits mit 0 aufgefüllt werden.
Der Typ double ist 64 Bit groß und verwendet eine Gleitkommadarstellung mit doppelter Genauigkeit:
Das Vorzeichenbit belegt 1 Bit, die Exponentenbits belegen 11 Bit und die Mantissenbits belegen 52 Bit.
An dieser Stelle kann man bereits vage erkennen, dass:
Die Exponentenbits bestimmen den Wertebereich,denn je größer die Zahlen sind, die die Exponentenbits darstellen können, desto größer sind die Zahlen, die dargestellt werden können!
Die Mantissenbits bestimmen die Berechnungsgenauigkeit,denn je größer die Zahlen sind, die die Mantissenbits darstellen können, desto größer ist die Berechnungsgenauigkeit!
Es ist vielleicht noch nicht klar genug, sehen wir uns Beispiele an:
float hat nur 23 Bruchbits, d. h. 23 Binärbits. Die maximale Dezimalzahl, die er darstellen kann, ist 2 hoch 23, also 8,388,608, d. h. 7 Dezimalstellen. Genau genommen kann die Präzision nur 6 Dezimalstellen einer Berechnung mit 100% Sicherheit garantieren.
double hat 52 Bruchbits, entsprechend einem maximalen Dezimalwert von 4,503,599,627,370,496. Diese Zahl hat 16 Stellen, daher kann die Berechnungspräzision nur 15 Dezimalstellen einer Berechnung mit 100% Sicherheit garantieren.
PS: Übliche wissenschaftliche Taschenrechner, wie sie in der Oberstufe verwendet werden, unterstützen im Allgemeinen maximal 15 Stellen einer Berechnung; darüber hinaus ist die Genauigkeit unzureichend. In der tatsächlichen Programmierung wird der Typ double ebenfalls häufiger verwendet, weil er 15 Stellen einer Berechnung garantieren kann. Wenn eine noch höhere Präzision bei Berechnungen benötigt wird, sind andere Datentypen erforderlich, z. B. BigDecimal in Java, das Berechnungen mit höherer Präzision unterstützt.
3. Offset der Exponentenbits und vorzeichenlose Darstellung
Beachten Sie, dass der Exponent negativ oder positiv sein kann, das heißt,der Exponent ist eine vorzeichenbehaftete Ganzzahl.Berechnungen mit vorzeichenbehafteten Ganzzahlen sind umständlicher als mit vorzeichenlosen Ganzzahlen. Um unnötigen Aufwand zu vermeiden, muss der Exponent bei der tatsächlichen Speicherung daher umgewandelt werden ineine vorzeichenlose Ganzzahl.Wie erfolgt also die Umwandlung?
Beachten Sie, dass der Exponententeil eines float 8 Bits umfasst, der Exponentenbereich also von -126 bis +127 reicht. Um die Auswirkung negativer Zahlen auf tatsächliche Berechnungen (wie Vergleiche, Addition und Subtraktion usw.) zu beseitigen, kann bei der tatsächlichen Speicherung eine einfache Abbildung auf den Exponenten angewendet werden, indem einOffset hinzugefügt wird.Zum Beispiel ist der Offset für den Exponenten von float 127, sodass keine negativen Zahlen auftreten.
Zum Beispiel:
Wenn der Exponent 6 ist, wird tatsächlich 6+127=133 gespeichert, d. h. 133 wird in Binär umgewandelt und dann gespeichert.
Wenn der Exponent -3 ist, wird tatsächlich -3+127=124 gespeichert, d. h. 124 wird in Binär umgewandelt und dann gespeichert.
Wenn wir die tatsächlich dargestellte Dezimalzahl berechnen müssen, subtrahieren wir einfach den Offset vom Exponenten.
Für den entsprechenden double-Typ beträgt der Exponenten-Offset bei der Speicherung 1023.
4. Zum Schluss
Um die Dezimalbruchzahl 78.375 mit dem float-Typ zu speichern, müssen Sie sie zuerst in eine Gleitkommazahl umwandeln und erhalten dabei dasVorzeichenbit,undden Exponenten,undund den Bruchteil.Dieses Beispiel wurde oben bereits analysiert, also:
Das Vorzeichenbit ist 0, die Exponentenbits sind 6+127=133, deren Binärdarstellung 10 000 101 ist, und der Bruchteil ist 001110011. Bitte füllen Sie den unzureichenden Teil automatisch mit 0 auf.
Zusammenhängend aneinandergereiht und als float dargestellt, ist der fettgedruckte Teil die Exponentenbits, und das am weitesten links stehende Bit ist das Vorzeichenbit 0, das eine positive Zahl darstellt:
0 10000101 001110011 00000 00000 0000
Wenn Sie double zum Speichern verwenden ... berechnen Sie es selbst; es gibt zu viele Nullen.
Autor: Boss呱呱
Link: https://www.zhihu.com/question/46432979/answer/221485161