Gleitkommaformat mit einfacher Genauigkeit - Single-precision floating-point format

Das Gleitkommaformat mit einfacher Genauigkeit (manchmal auch als FP32 oder float32 bezeichnet ) ist ein Computerzahlenformat , das normalerweise 32 Bit im Computerspeicher belegt ; es repräsentiert einen breiten dynamischen Bereich numerischer Werte durch die Verwendung eines Gleitkommas .

Eine Gleitkommavariable kann auf Kosten der Genauigkeit einen größeren Zahlenbereich darstellen als eine Festkommavariable der gleichen Bitbreite. Ein signiertes 32-Bit - Integer - Variable hat einen Maximalwert von 2 31 - 1 = 2,147,483,647, während eine IEEE 754 32-Bit - Basis-2 Gleitkommavariable einen Maximalwert von HAS (2 - 2 -23 ) × 2 127 ≈ 3,4028235 × 10 38 . Alle ganzen Zahlen mit 7 oder weniger Dezimalstellen und beliebigen 2 n für eine ganze Zahl −149 n ≤ 127 können exakt in einen IEEE 754-Gleitkommawert mit einfacher Genauigkeit umgewandelt werden.

Im IEEE 754-2008- Standard wird das 32-Bit-Base-2-Format offiziell als binary32 bezeichnet ; es wurde in IEEE 754-1985 als Single bezeichnet . IEEE 754 spezifiziert zusätzliche Gleitkommatypen, wie 64-Bit-Basis-2- Double-Precision und neuerdings auch Basis-10-Darstellungen.

Eine der ersten Programmiersprachen , die Gleitkommadatentypen mit einfacher und doppelter Genauigkeit bereitstellte, war Fortran . Vor der weit verbreiteten Einführung von IEEE 754-1985 hingen die Darstellung und Eigenschaften von Gleitkomma-Datentypen vom Computerhersteller und Computermodell sowie von Entscheidungen der Programmiersprachendesigner ab. ZB war der Datentyp mit einfacher Genauigkeit von GW-BASIC das 32-Bit-MBF- Gleitkommaformat.

Einfache Genauigkeit wird als REAL in Fortran , SINGLE-FLOAT in Common Lisp , Schwimmer in C , C ++ , C # , Java , Float in Haskell und Swift und Single in Object Pascal ( Delphi ), Visual Basic , und MATLAB . Allerdings Schwimmer in Python , Ruby - , PHP und OCaml und einzelne in Versionen von Octave vor 3.2 beziehen sich auf doppelte Genauigkeit Zahlen. In den meisten Implementierungen von PostScript und einigen eingebetteten Systemen ist die einzige unterstützte Genauigkeit Single.

Binäres Gleitkommaformat nach IEEE 754 mit einfacher Genauigkeit: binary32

Der IEEE 754-Standard spezifiziert eine binary32 mit:

Dies ergibt eine Genauigkeit von 6 bis 9 signifikanten Dezimalstellen . Wenn eine Dezimalzeichenfolge mit höchstens 6 signifikanten Stellen in eine IEEE 754-Darstellung mit einfacher Genauigkeit umgewandelt und dann wieder in eine Dezimalzeichenfolge mit der gleichen Anzahl von Stellen umgewandelt wird, sollte das Endergebnis mit der ursprünglichen Zeichenfolge übereinstimmen. Wenn eine IEEE 754-Zahl mit einfacher Genauigkeit in eine Dezimalzeichenfolge mit mindestens 9 signifikanten Stellen umgewandelt und dann wieder in eine Darstellung mit einfacher Genauigkeit umgewandelt wird, muss das Endergebnis mit der ursprünglichen Zahl übereinstimmen.

Das Vorzeichenbit bestimmt das Vorzeichen der Zahl, das auch das Vorzeichen des Signifikanten ist. Der Exponent ist eine 8-Bit-Ganzzahl ohne Vorzeichen von 0 bis 255 in vorgespannter Form : ein Exponentenwert von 127 repräsentiert die tatsächliche Null. Exponenten reichen von −126 bis +127, da Exponenten von −127 (alle 0s) und +128 (alle 1s) für Sonderzahlen reserviert sind.

Der wahre Signifikand enthält 23 Bruchbits rechts vom Binärkomma und ein implizites führendes Bit (links vom Binärkomma) mit dem Wert 1, es sei denn, der Exponent wird mit Nullen gespeichert. Somit erscheinen nur 23 Bruchbits des Signifikanten im Speicherformat, aber die Gesamtgenauigkeit beträgt 24 Bit (entspricht log 10 (2 24 ) 7,225 Dezimalstellen). Die Bits sind wie folgt angeordnet:

Float-Beispiel.svg

Der reelle Wert, der von einem gegebenen 32-Bit- Binär32- Datenwert mit einem gegebenen Vorzeichen , einem vorgespannten Exponenten e (der 8-Bit-Ganzzahl ohne Vorzeichen) und einem 23-Bit-Bruch angenommen wird, ist

,

was ergibt

In diesem Beispiel:

  • ,
  • ,
  • ,
  • ,
  • .

daher:

  • .

Notiz:

  • ,
  • ,
  • ,
  • .

Exponentencodierung

Der binäre Gleitkomma-Exponent mit einfacher Genauigkeit wird unter Verwendung einer Offset-Binär- Darstellung codiert , wobei der Null-Offset 127 beträgt; im IEEE 754-Standard auch als Exponent-Bias bekannt.

  • E min = 01 H -7F H = -126
  • E max = FE H -7F H = 127
  • Exponenten-Bias = 7F H = 127

Um also den wahren Exponenten zu erhalten, wie er durch die Offset-Binärdarstellung definiert ist, muss der Offset von 127 vom gespeicherten Exponenten subtrahiert werden.

Die gespeicherten Exponenten 00 H und FF H werden speziell interpretiert.

Exponent Bruch = 0 Bruch ≠ 0 Gleichung
00 H = 00000000 2 ±null subnormale Zahl
01 H , ..., FE H = 0000001 2 , ..., 11111110 2 Normaler Wert
FF H = 11111111 2 ± unendlich NaN (ruhig, signalisierend)

Der minimale positive Normalwert ist und der minimale positive (subnormale) Wert ist .

Konvertieren von der Dezimaldarstellung in das Binär32-Format

Im Allgemeinen beziehen Sie sich auf den IEEE 754-Standard selbst für die strikte Konvertierung (einschließlich des Rundungsverhaltens) einer reellen Zahl in das entsprechende binäre32-Format.

Hier können wir zeigen, wie man eine reelle Zahl zur Basis 10 in ein IEEE 754-Binär32-Format umwandelt, indem wir die folgende Übersicht verwenden:

  • Betrachten Sie eine reelle Zahl mit einer ganzen Zahl und einem Bruchteil wie 12,375
  • Konvertieren und normalisieren Sie den ganzzahligen Teil in binär
  • Konvertieren Sie den Bruchteil mit der folgenden Technik, wie hier gezeigt
  • Fügen Sie die beiden Ergebnisse hinzu und passen Sie sie an, um eine korrekte endgültige Konvertierung zu erzielen

Umrechnung des Bruchteils: Betrachten Sie 0,375, den Bruchteil von 12,375. Um ihn in einen binären Bruch umzuwandeln, multiplizieren Sie den Bruch mit 2, nehmen Sie den ganzzahligen Teil und wiederholen Sie mit dem neuen Bruch mit 2, bis ein Bruch von Null gefunden wird oder bis die Genauigkeitsgrenze erreicht ist, die 23 Nachkommastellen für das binäre 32-Format nach IEEE 754 beträgt .

, der ganzzahlige Teil stellt die binäre Bruchziffer dar. Multiplizieren Sie 0,750 erneut mit 2, um fortzufahren
, Bruch = 0,011, terminieren

Wir sehen, dass dies in binär als genau dargestellt werden kann . Nicht alle Dezimalbrüche können in einem endlichen binären Bruch dargestellt werden. Dezimal 0,1 kann beispielsweise nicht exakt binär dargestellt werden, sondern nur angenähert. Deswegen:

Da das IEEE 754-Binär32-Format erfordert, dass reelle Werte im Format dargestellt werden (siehe Normalisierte Zahl , Denormalisierte Zahl ), wird 1100.011 um 3 Stellen nach rechts verschoben, um zu . zu werden

Endlich können wir das sehen:

Daraus leiten wir ab:

  • Der Exponent ist 3 (und in der verzerrten Form ist er daher )
  • Der Bruch ist 100011 (Blick nach rechts vom Binärkomma)

Aus diesen können wir die resultierende 32-Bit-IEEE 754-Binär32-Formatdarstellung von 12.375 bilden:

Hinweis: Ziehen Sie in Betracht, 68.123 in das IEEE 754-Binär32-Format zu konvertieren: Wenn Sie das obige Verfahren verwenden, erwarten Sie, dass die letzten 4 Bits 1001 sind. Aufgrund des standardmäßigen Rundungsverhaltens des IEEE 754-Formats erhalten Sie jedoch , dessen letzte 4 Bits sind 1010.

Beispiel 1: Betrachten Sie Dezimal 1. Wir können das sehen:

Daraus leiten wir ab:

  • Der Exponent ist 0 (und in der verzerrten Form daher )
  • Der Bruch ist 0 (ein Blick nach rechts vom Binärkomma in 1.0 ist alles )

Aus diesen können wir die resultierende 32-Bit-Darstellung im binären32-Format nach IEEE 754 der reellen Zahl 1 bilden:

Beispiel 2: Betrachten Sie einen Wert von 0,25. Wir können das sehen:

Daraus leiten wir ab:

  • Der Exponent ist −2 (und in der verzerrten Form ist er )
  • Der Bruch ist 0 (rechts vom Binärkomma in 1.0 sind alle Nullen)

Daraus können wir die resultierende 32-Bit-Darstellung im binären 32-Bit-IEEE 754-Format der reellen Zahl 0,25 bilden:

Beispiel 3: Betrachten Sie einen Wert von 0,375. Das haben wir gesehen

Daher können wir nach der Bestimmung einer Darstellung von 0,375 wie oben vorgehen:

  • Der Exponent ist −2 (und in der verzerrten Form ist er )
  • Der Bruch ist 1 (rechts vom Binärkomma in 1.1 ist ein einzelner )

Aus diesen können wir die resultierende 32-Bit-Darstellung im binären 32-Format nach IEEE 754 der reellen Zahl 0,375 bilden:

Single-Precision-Beispiele

Diese Beispiele werden in Bit- Darstellung , in hexadezimaler und binärer Form , des Gleitkommawerts angegeben. Dazu gehören das Vorzeichen, der (verzerrte) Exponent und der Signifikand.

0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45
                                                   (smallest positive subnormal number)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38
                                                   (largest subnormal number)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38
                                                   (smallest positive normal number)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038
                                                   (largest normal number)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0.999999940395355225
                                                   (largest number less than one)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (one)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955
                                                   (smallest number larger than one)
1 10000000 000000000000000000000002 = c000 000016 = −2
0 00000000 000000000000000000000002 = 0000 000016 = 0
1 00000000 000000000000000000000002 = 8000 000016 = −0
                                   
0 11111111 000000000000000000000002 = 7f80 000016 = infinity
1 11111111 000000000000000000000002 = ff80 000016 = −infinity
                                   
0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3.14159274101257324 ≈ π ( pi )
0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3
                                   
x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (on x86 and ARM processors)
x 11111111 000000000000000000000012 = ff80 000116 = sNaN (on x86 and ARM processors)

Aufgrund der geraden Anzahl von Bits im Signifikand wird standardmäßig 1/3 aufgerundet, anstatt wie doppelte Genauigkeit abzurunden. Die Bits von 1/3 hinter dem Rundungspunkt sind das, 1010...was an letzter Stelle mehr als 1/2 einer Einheit ist .

Kodierungen von qNaN und sNaN sind in IEEE 754 nicht spezifiziert und auf verschiedenen Prozessoren unterschiedlich implementiert. Die Prozessoren der x86- Familie und der ARM- Familie verwenden das höchstwertige Bit des Signifikand-Feldes, um ein ruhiges NaN anzuzeigen. Die PA-RISC- Prozessoren verwenden das Bit, um eine Signalisierungs-NaN anzuzeigen.

Konvertieren von binär mit einfacher Genauigkeit in dezimal

Wir beginnen in diesem Beispiel mit der hexadezimalen Darstellung des Wertes 41C80000 und wandeln ihn in binär um:

dann zerlegen wir es in drei Teile: Vorzeichenbit, Exponent und Signifikant.

  • Vorzeichenbit:
  • Exponent:
  • Bedeutung:

Dann fügen wir das implizite 24. Bit zum Signifikanten hinzu:

  • Bedeutung:

und decodiere den Exponentenwert durch Subtrahieren von 127:

  • Rohexponent:
  • Dekodierter Exponent:

Jedes der 24 Bits des Signifikanten (einschließlich des impliziten 24. Bits), Bit 23 bis Bit 0, stellt einen Wert dar, beginnend bei 1 und halbiert sich für jedes Bit wie folgt:

bit 23 = 1
bit 22 = 0.5
bit 21 = 0.25
bit 20 = 0.125
bit 19 = 0.0625
bit 18 = 0.03125
.
.
bit 0 = 0.00000011920928955078125

Der Signifikant in diesem Beispiel hat drei gesetzte Bits: Bit 23, Bit 22 und Bit 19. Wir können nun den Signifikanten decodieren, indem wir die durch diese Bits repräsentierten Werte addieren.

  • Dekodierte Bedeutung:

Dann müssen wir mit der Basis 2 hoch des Exponenten multiplizieren, um das Endergebnis zu erhalten:

Daher

Dies ist äquivalent zu:

wobei s das Vorzeichenbit ist, x der Exponent ist und m der Signifikand ist.

Genauigkeitsbeschränkungen für Dezimalwerte in [1, 16777216]

  • Dezimalstellen zwischen 1 und 2: festes Intervall 2 −23 (1+2 −23 ist der nächstgrößere Float nach 1)
  • Dezimalstellen zwischen 2 und 4: festes Intervall 2 −22
  • Dezimalstellen zwischen 4 und 8: festes Intervall 2 −21
  • ...
  • Dezimalstellen zwischen 2 n und 2 n+1 : festes Intervall 2 n-23
  • ...
  • Dezimalstellen zwischen 2 22 =4194304 und 2 23 =8388608: festes Intervall 2 −1 =0.5
  • Dezimalstellen zwischen 2 23 =8388608 und 2 24 =16777216: festes Intervall 2 0 =1

Genauigkeitsbeschränkungen für ganzzahlige Werte

  • Ganzzahlen zwischen 0 und 16777216 können exakt dargestellt werden (gilt auch für negative Ganzzahlen zwischen −16777216 und 0)
  • Ganzzahlen zwischen 2 24 =16777216 und 2 25 =33554432 runden auf ein Vielfaches von 2 (gerade Zahl)
  • Ganzzahlen zwischen 2 25 und 2 26 runden auf ein Vielfaches von 4
  • ...
  • Ganzzahlen zwischen 2 n und 2 n+1 runden auf ein Vielfaches von 2 n-23
  • ...
  • Ganzzahlen zwischen 2 127 und 2 128 runden auf ein Vielfaches von 2 104
  • Ganzzahlen größer oder gleich 2 128 werden auf "unendlich" gerundet.

Optimierungen

Das Design des Gleitkommaformats ermöglicht verschiedene Optimierungen, die sich aus der einfachen Generierung einer Basis-2-Logarithmus- Approximation aus einer ganzzahligen Sicht des Rohbitmusters ergeben. Ganzzahlarithmetik und Bitverschiebung können eine Annäherung an die reziproke Quadratwurzel ( schnelle inverse Quadratwurzel ) ergeben, die üblicherweise in der Computergrafik benötigt wird .

Siehe auch

Verweise

Externe Links