Der Dezimalpunkt wird nirgendwo explizit gespeichert. Das ist ein Anzeigeproblem.
Die folgende Erklärung ist eine Vereinfachung; Ich lasse viele wichtige Details aus und meine Beispiele sollen keine reale Plattform darstellen. Es sollte Ihnen einen Eindruck davon geben, wie Gleitkommawerte im Speicher dargestellt werden und welche Probleme damit verbunden sind. Sie sollten jedoch nach aussagekräftigeren Quellen suchen, z. B. Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte .
Beginnen Sie mit der Darstellung eines Gleitkommawerts in einer Variante der wissenschaftlichen Notation, wobei Sie Basis 2 anstelle von Basis 10 verwenden. Beispielsweise kann der Wert 3.14159 als dargestellt werden
0,7853975 * 2 2
0,7853975 ist der Signifikand , auch bekannt als die Mantisse; Es ist der Teil der Zahl, der die signifikanten Ziffern enthält. Dieser Wert wird mit der zur Potenz von 2 erhobenen Basis 2 multipliziert, um 3,14159 zu erhalten.
Gleitkommazahlen werden durch Speichern des Signifikanten und des Exponenten (zusammen mit einem Vorzeichenbit) codiert.
Ein typisches 32-Bit-Layout sieht ungefähr so aus:
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
Wie bei Integer-Typen mit Vorzeichen gibt das höherwertige Bit ein Vorzeichen an. 0 zeigt einen positiven Wert an, 1 zeigt einen negativen an.
Die nächsten 8 Bits werden für den Exponenten verwendet. Exponenten können positiv oder negativ sein, aber anstatt ein anderes Vorzeichenbit zu reservieren, werden sie so codiert, dass 10000000 0 darstellt, also 00000000 -128 und 11111111 127 darstellt.
Die restlichen Bits werden für den Signifikanten verwendet. Jedes Bit repräsentiert eine negative Zweierpotenz von links, also:
01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5
= 0,25 + 0,125 + 0,03125
= 0,40625
Einige Plattformen setzen ein "verstecktes" führendes Bit im Hochkomma voraus, das immer auf 1 gesetzt ist, daher liegen die Werte im Hochkomma immer zwischen [0,5, 1]. Auf diese Weise können diese Plattformen Werte mit einer etwas höheren Genauigkeit speichern (mehr dazu weiter unten). Mein Beispiel macht das nicht.
Unser Wert von 3,14159 würde also so etwas wie dargestellt werden
0 10000010 11001001000011111100111
^^^
| | |
| | + --- Hochkomma = 0,7853975 ...
| |
| + ------------------- Exponent = 2 (130 - 128)
|
+ ------------------------- Vorzeichen = 0 (positiv)
Wert = -1 (Vorzeichen) * 2 (Exponent) * (Signifikand)
value = -1 0 * 2 2 * 0.7853975 ...
value = 3.14159 ...
Wenn Sie alle Bits in der Bedeutung addieren, werden Sie feststellen, dass die Summe nicht 0,7853975 beträgt. Sie kommen tatsächlich auf 0,78539747. Es sind nicht genügend Bits vorhanden, um den Wert genau zu speichern . Wir können nur eine Annäherung speichern. Die Anzahl der Bits im Hochkomma bestimmt die Genauigkeit oder wie viele Hochkommazahlen Sie speichern können. 23 Bits ergeben eine Genauigkeit von ungefähr 6 Dezimalstellen. 64-Bit-Gleitkommatypen bieten genügend Bits in der Bedeutung, um eine Genauigkeit von ungefähr 12 bis 15 Stellen zu erzielen. Beachten Sie jedoch, dass es Werte gibt, die nicht genau dargestellt werden können, egal wieviele Bits, die Sie verwenden. So wie Werte wie 1/3 nicht in einer endlichen Anzahl von Dezimalstellen dargestellt werden können, können Werte wie 1/10 nicht in einer endlichen Anzahl von Bits dargestellt werden. Da es sich bei den Werten um Näherungswerte handelt, handelt es sich bei den Berechnungen auch um Näherungswerte, und es kommt zu Rundungsfehlern.
Die Anzahl der Bits im Exponenten bestimmt den Bereich (die minimalen und maximalen Werte, die Sie darstellen können). Wenn Sie sich jedoch Ihren Minimal- und Maximalwerten nähern, vergrößert sich die Lücke zwischen darstellbaren Werten. Das heißt, wenn Sie Werte zwischen 0,785397 und 0,785398 nicht genau darstellen können, können Sie auch keine Werte zwischen 7,85397 und 7,85398 oder Werte zwischen 78,5397 und 78,5398 oder Werte zwischen 785397,0 und 785398,0 genau darstellen. Seien Sie vorsichtig, wenn Sie sehr große (betragsmäßig) Zahlen mit sehr kleinen Zahlen multiplizieren.