Inhalt:
Bild: http://pikabu.ru/
Einführung
Gleich in den ersten Tagen, als ich Java lernte, stieß ich auf eine so seltsame Art von Grundelementen wie Gleitkommazahlen. Ich war sofort an ihren Funktionen interessiert und vor allem an der Art und Weise, wie sie im Binärcode geschrieben waren (der miteinander verbunden ist). Im Gegensatz zu jedem Bereich von ganzen Zahlen gibt es selbst in einem sehr kleinen Bereich (z. B. von 1 bis 2) unendlich viele davon. Und da die Speichergröße endlich ist, ist es unmöglich, diese Menge auszudrücken. Wie werden sie also binär ausgedrückt und wie funktionieren sie? Leider haben mir die Erklärungen im
Wiki und ein ziemlich cooler Artikel über Habré
hier kein vollständiges Verständnis vermittelt, obwohl sie den Grundstein gelegt haben. Die Erkenntnis kam erst, als ich diesen
Analyseartikel am Morgen nach der Lektüre las.
Ausflug in die Geschichte
( aus
diesem Artikel über Habré entnommen ) In den 60er und 70er Jahren, als Computer groß und Programme klein waren, gab es noch keinen einheitlichen Standard für Berechnungen und auch keinen Standard für die Darstellung der Gleitkommazahl selbst. Jeder Computer machte es anders und jeder hatte seine eigenen Fehler. Doch Mitte der 70er Jahre beschloss Intel, neue Prozessoren mit unterstützter „verbesserter“ Arithmetik herzustellen und diese gleichzeitig zu standardisieren. Die Professoren William Kahan und John Palmer (nein, nicht der Autor von Büchern über Bier) wurden mit der Entwicklung beauftragt. Es gab etwas Drama, aber es wurde ein neuer Standard entwickelt. Jetzt heißt dieser Standard IEEE754
Fließkommazahlenformat
Schon in Schulbüchern war jeder mit der ungewöhnlichen Schreibweise sehr großer oder sehr kleiner Zahlen der Form
1,2 × 10 3 oder
1,2 E3 konfrontiert, was 1,2 × 1000 = 1200 entspricht . Dies wird als exponentielle Notationsmethode bezeichnet. In diesem Fall handelt es sich um den Ausdruck einer Zahl nach der Formel:
N=M×n p , wobei
- N = 1200 - die resultierende Zahl
- M = 1,2 - Mantisse - Bruchteil, ohne Berücksichtigung von Ordnungen
- n = 10 ist die Basis der Ordnung. In diesem Fall und wenn es sich nicht um Computer handelt, ist die Basis die Zahl 10
- p = 3 - Grad der Basis
Sehr oft wird angenommen, dass die Basis der Ordnung 10 ist
und nur die Mantisse und der Wert der Basis geschrieben werden, getrennt durch den Buchstaben
E. In unserem Beispiel habe ich äquivalente Einträge
1,2 × 10 3 und
1,2 E3 gegeben . Wenn alles klar ist und wir den nostalgischen Ausflug in den Lehrplan abgeschlossen haben, dann empfehle ich jetzt, dies zu vergessen, denn bei der Bildung einer Gleitkommazahl haben wir es zu tun Zweierpotenzen, nicht Zehnerpotenzen, d.h.
n = 2 , die gesamte harmonische Formel
1.2E3 bricht zusammen und hat mir wirklich den Kopf zerbrochen.
Zeichen und Abschluss
Was haben wir also? Dadurch haben wir auch eine Binärzahl, die aus
einer Mantisse – dem Teil, den wir potenzieren werden, und der Potenz selbst besteht. Darüber hinaus verfügen Gleitkommazahlen, wie es bei Ganzzahltypen üblich ist, über ein Bit, das das Vorzeichen bestimmt – ob die Zahl positiv oder negativ ist. Als Beispiel schlage ich vor, den Typ zu betrachten
float
, der aus 32 Bits besteht. Bei Zahlen mit doppelter Genauigkeit
double
ist die Logik dieselbe, nur dass es doppelt so viele Bits gibt. Von den 32 Bits ist das höchstwertige Bit dem Vorzeichen zugeordnet, die nächsten 8 Bits sind dem Exponenten zugeordnet – der Potenz, mit der wir die Mantisse erhöhen werden, und die restlichen 23 Bits sind der Mantisse zugeordnet. Schauen wir uns zur Veranschaulichung ein Beispiel an:
Das erste Bit ist sehr einfach. Wenn der Wert des ersten Bits
0 ist , ist die Zahl, die wir erhalten,
positiv . Wenn das Bit
1 ist , ist die Zahl
negativ . Der nächste Block aus 8 Bits ist ein Exponentenblock. Der Exponent wird als reguläre
Acht-Bit- Zahl geschrieben, und um den erforderlichen Grad zu erhalten, müssen wir von der resultierenden Zahl 127 subtrahieren . In unserem Fall sind die acht Bits des Exponenten
10000001 . Dies entspricht der Zahl
129 . Wenn Sie eine Frage zur Berechnung haben, finden Sie auf dem Bild eine schnelle Antwort. Eine erweiterte Version kann in jedem Booleschen Algebra-Kurs erworben werden.
1×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Es ist nicht schwer zu berechnen, dass die maximale Zahl, die wir aus diesen 8 Bits erhalten können,
11111111 ist . 2 = 255 10 (Index
2 und
10 bedeuten binäre und dezimale Zahlensysteme). Wenn wir jedoch nur positive Exponentenwerte verwenden (
von 0 bis 255 ), dann haben die resultierenden Zahlen viele Zahlen vor dem Komma, aber nicht danach? Um negative Gradwerte zu erhalten, müssen Sie
127 vom generierten Exponenten subtrahieren . Somit liegt der Gradbereich
zwischen -127 und 128 . In unserem Beispiel beträgt der erforderliche Abschluss
129-127 = 2 . Erinnern wir uns vorerst an diese Zahl.
Mantisse
Nun zur Mantisse. Es besteht aus 23 Bits, am Anfang ist aber immer eine weitere Einheit impliziert, für die die Bits nicht belegt sind. Dies geschieht aus Zweckmäßigkeits- und Wirtschaftlichkeitsgründen. Dieselbe Zahl kann in verschiedenen Potenzen ausgedrückt werden, indem man vor oder nach dem Dezimalpunkt Nullen zur Mantisse hinzufügt. Am einfachsten lässt sich das mit einem Dezimalexponenten verstehen:
120.000 = 1,2×10 5 = 0,12×10 6 = 0,012×10 7 = 0,0012×10 8 usw. Durch die Eingabe einer festen Zahl im Kopf der Mantisse erhalten wir jedoch jedes Mal neue Zahlen. Nehmen wir an, dass es vor unseren 23 Bits noch eins mit eins geben wird. Normalerweise wird dieses Bit durch einen Punkt vom Rest getrennt, was jedoch keine Bedeutung hat. Es ist einfach bequemer 1. 111000000000000000000000
Nun muss die resultierende Mantisse von links nach rechts potenziert werden, wobei die Potenz bei jedem Schritt um eins verringert wird. Wir beginnen mit dem Wert der Potenz, den wir als Ergebnis der Berechnung erhalten haben, also
2 (ich habe bewusst ein einfaches Beispiel gewählt, um nicht jeden Wert der Zweierpotenz aufzuschreiben, und habe sie auch nicht in der obigen Tabelle berechnet, als die entsprechendes Bit ist Null)
1×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7,5 und habe das Ergebnis
7,5 erhalten , die Richtigkeit kann beispielsweise unter
diesem Link überprüft werden
Ergebnisse
Eine Standard-Gleitkommazahl
float
besteht aus 32 Bits, das erste Bit ist das Vorzeichen (+ oder -), die nächsten acht sind der Exponent, die nächsten 23 sind die Mantisse. Durch Vorzeichen – wenn Bit 0 eine positive Zahl ist. Wenn Bit 1 negativ ist.
Mit der Exponentialfunktion konvertieren wir bitweise in eine Dezimalzahl (das erste Bit von links ist
128 , das zweite ist
64 , das dritte ist
32 , das vierte ist
16 , das fünfte ist
8 , das sechste ist
4 , das siebte ist
2 ). der Achtel ist
1 ), subtrahieren Sie
127 von der resultierenden Zahl , wir erhalten den Grad, mit dem wir beginnen.
Gemäß der Mantisse - zu den vorhandenen 23 Bits vorne fügen wir ein weiteres Bit mit dem Wert 1 hinzu und beginnen daraus mit der Potenz, die wir erhalten haben, wobei wir diese Potenz mit jedem weiteren Bit dekrementieren.
Das ist alles, Leute, Kinder! PS: Hinterlassen Sie als Hausaufgabe anhand dieses Artikels in den Kommentaren Ihre Versionen, warum es bei einer großen Anzahl von Rechenoperationen mit Gleitkommazahlen zu Präzisionsfehlern kommt
GO TO FULL VERSION