Welcher Zahlenbereich kann in einem 16-, 32- und 64-Bit-IEEE-754-System dargestellt werden?

76

Ich weiß ein wenig darüber, wie Gleitkommazahlen dargestellt werden, aber leider nicht genug.

Die allgemeine Frage lautet:

Welcher Zahlenbereich kann für eine bestimmte Genauigkeit (für meine Zwecke die Anzahl der genauen Dezimalstellen in Basis 10) für 16-, 32- und 64-Bit-IEEE-754-Systeme dargestellt werden?

Insbesondere interessiert mich nur der Bereich von 16-Bit- und 32-Bit-Zahlen, die auf +/- 0,5 (die Einerstelle) oder +/- 0,0005 (die Tausendstelstelle) genau sind.

Nate Parsons
quelle
1
@ Bendin sogar 8-Bit oder weniger Float existiert und wird oft im Lehrplan der Informatik unterrichtet. Es wird auch in der ARM-Befehlskodierung verwendet . 10, 11, 14-Bit-Floats existieren ebenfalls
phuclv

Antworten:

104

Für eine gegebene IEEE-754- Gleitkommazahl X , wenn

2^E <= abs(X) < 2^(E+1)

dann ist der Abstand von X zur nächstgrößeren darstellbaren Gleitkommazahl ( epsilon ):

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Mit den obigen Gleichungen können wir Folgendes berechnen:

  • Für halbe Präzision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wünschen, kann die Zahl maximal 2 ^ 10 sein. Jeder größere als dieser und der Abstand zwischen Gleitkommazahlen ist größer als 0,5.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (ca. 2 ^ -11) wünschen, kann die Zahl maximal 1 sein. Größer als diese und der Abstand zwischen Gleitkommazahlen ist größer als 0,0005.

  • Für einfache Präzision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wünschen, kann die Zahl maximal 2 ^ 23 sein. Jeder größere als dieser und der Abstand zwischen Gleitkommazahlen ist größer als 0,5.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (ca. 2 ^ -11) wünschen, kann die Zahl maximal 2 ^ 13 sein. Jeder größere als dieser und der Abstand zwischen Gleitkommazahlen ist größer als 0,0005.

  • Für doppelte Präzision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wünschen, kann die Zahl maximal 2 ^ 52 sein. Jeder größere als dieser und der Abstand zwischen Gleitkommazahlen ist größer als 0,5.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (ca. 2 ^ -11) wünschen, kann die Zahl maximal 2 ^ 42 sein. Jeder größere als dieser und der Abstand zwischen Gleitkommazahlen ist größer als 0,0005.

gnovice
quelle
3
In Metern bedeutet dies, dass bei einer Genauigkeit von 1 m bzw. 1 mm die halbe Genauigkeit 1 km und 1 m, die einfache Genauigkeit 8 mm und 8 km und die doppelte Genauigkeit 4Pm und 4Tm zulässt.
Aaron Franke
22

Für Gleitkomma-Ganzzahlen (ich werde meine Antwort in Bezug auf IEEE-Doppelgenauigkeit geben) ist jede Ganzzahl zwischen 1 und 2 ^ 53 genau darstellbar. Jenseits von 2 ^ 53 werden Ganzzahlen, die genau darstellbar sind, durch Erhöhen der Zweierpotenzen voneinander beabstandet. Zum Beispiel:

  • Jede 2. ganze Zahl zwischen 2 ^ 53 + 2 und 2 ^ 54 kann genau dargestellt werden.
  • Jede 4. ganze Zahl zwischen 2 ^ 54 + 4 und 2 ^ 55 kann genau dargestellt werden.
  • Jede 8. ganze Zahl zwischen 2 ^ 55 + 8 und 2 ^ 56 kann genau dargestellt werden.
  • Jede 16. ganze Zahl zwischen 2 ^ 56 + 16 und 2 ^ 57 kann genau dargestellt werden.
  • Jede 32. ganze Zahl zwischen 2 ^ 57 + 32 und 2 ^ 58 kann genau dargestellt werden.
  • Jede 64. ganze Zahl zwischen 2 ^ 58 + 64 und 2 ^ 59 kann genau dargestellt werden.
  • Jede 128. ganze Zahl zwischen 2 ^ 59 + 128 und 2 ^ 60 kann genau dargestellt werden.
  • Jede 256. ganze Zahl zwischen 2 ^ 60 + 256 und 2 ^ 61 kann genau dargestellt werden.
  • Jede 512. ganze Zahl zwischen 2 ^ 61 + 512 und 2 ^ 62 kann genau dargestellt werden. . . .

Ganzzahlen, die nicht genau darstellbar sind, werden auf die nächste darstellbare Ganzzahl gerundet, sodass die Rundung im ungünstigsten Fall die Hälfte des Abstands zwischen darstellbaren Ganzzahlen beträgt.

Rick Regan
quelle
19

Die Präzision, die aus Peter Rs Link zum MSDN-Verweis zitiert wird, ist wahrscheinlich eine gute Faustregel, aber die Realität ist natürlich komplizierter.

Die Tatsache, dass der "Punkt" im "Gleitkomma" ein Binärpunkt und kein Dezimalpunkt ist, kann unsere Intuitionen besiegen. Das klassische Beispiel ist 0.1, das eine Genauigkeit von nur einer Dezimalstelle benötigt, aber überhaupt nicht genau binär darstellbar ist.

Wenn Sie ein Wochenende zum Töten haben, schauen Sie sich an, was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte . Sie werden wahrscheinlich besonders an den Abschnitten über Präzision und Konvertierung von Binär zu Dezimal interessiert sein .

Bendin
quelle
5

Zunächst einmal haben weder IEEE-754-2008 noch -1985 16-Bit-Floats. Es handelt sich jedoch um eine vorgeschlagene Addition mit einem 5-Bit-Exponenten und einem 10-Bit-Bruch. IEE-754 verwendet ein dediziertes Vorzeichenbit, sodass der positive und der negative Bereich gleich sind. Außerdem hat der Bruch eine implizite 1 vor sich, sodass Sie ein zusätzliches Bit erhalten.

Wenn Sie die Genauigkeit an der Stelle wünschen, an der Sie jede Ganzzahl darstellen können, ist die Antwort ziemlich einfach: Der Exponent verschiebt den Dezimalpunkt zum rechten Ende des Bruchs. Ein 10-Bit-Bruch ergibt also ± 2 11 .

Wenn Sie ein Bit nach dem Dezimalpunkt möchten, geben Sie ein Bit davor auf, sodass Sie ± 2 10 haben .

Die einfache Genauigkeit hat einen 23-Bit-Bruch, sodass Sie ± 2 24 Ganzzahlen haben.

Wie viele Genauigkeitsbits Sie nach dem Dezimalpunkt benötigen, hängt ganz von den Berechnungen ab, die Sie durchführen, und wie viele Sie ausführen.

  • 2 10 = 1.024
  • 2 11 = 2,048
  • 2 23 = 8,388,608
  • 2 24 = 16.777.216
  • 2 53 = 9.007.199.254.740.992 (doppelte Genauigkeit)
  • 2 113 = 10.384.593.717.069.655.257.060.992.658.440.192 (Quad-Präzision)

Siehe auch

derobert
quelle
2

Siehe IEEE 754-1985 :

v = (-1) ^ Vorzeichen * s ^ (Exponent-Exponent_Bias) * (1 + Bruch)

Hinweis (1 + Bruch). Wie @bendin hervorhebt , können Sie mit binärem Gleitkomma keine einfachen Dezimalwerte wie 0,1 ausdrücken. Die Implikation ist, dass Sie Rundungsfehler einführen können, indem Sie viele Male einfache Ergänzungen vornehmen oder Dinge wie Abschneiden aufrufen. Wenn Sie an irgendeiner Art von Präzision interessiert sind, können Sie diese nur erreichen, indem Sie eine Festkomma-Dezimalstelle verwenden, die im Grunde eine skalierte Ganzzahl ist.

Eugene Yokota
quelle
0

Wenn ich Ihre Frage richtig verstehe, hängt es von Ihrer Sprache ab.
Informationen zu C # finden Sie in der MSDN-Referenz . Float hat eine 7-stellige Genauigkeit und eine doppelte 15-16-stellige Genauigkeit.

Peter R.
quelle
7
Tatsächlich definiert IEEE-754 die Genauigkeit, daher sollte sie nicht sprachspezifisch sein.
Derobert
0

Ich habe eine ganze Weile gebraucht, um herauszufinden, dass ich bei der Verwendung von Doubles in Java nicht an Genauigkeit bei den Berechnungen verloren habe. Gleitkomma hat tatsächlich eine sehr gute Fähigkeit, Zahlen mit ziemlich vernünftiger Genauigkeit darzustellen. Die Genauigkeit, die ich verlor, war unmittelbar nach der Konvertierung der von Benutzern eingegebenen Dezimalzahlen in die von Haus aus unterstützte binäre Gleitkommadarstellung. Ich habe kürzlich begonnen, alle meine Zahlen in BigDecimal umzuwandeln. BigDecimal ist viel mehr Arbeit im Code als Floats oder Doubles, da es nicht zu den primitiven Typen gehört. Andererseits kann ich die Zahlen, die Benutzer eingeben, genau darstellen.

PanCrit
quelle