Zum Hauptinhalt springen

1.1 Maschinenzahlen

Definition (Tafel)​

Maschinenzahlen sind die Gleitkommazahlen, die auf einem Rechner exakt darstellbar sind:

M={0}  ∪  {±Eb∑i=1Nai E−i  ∣  ai∈{0,1,…,E−1},  a1≠0,  b∈Z,  bmin⁡≤b≤bmax⁡}\mathbb M=\{0\}\;\cup\;\Big\{\pm E^{b}\sum_{i=1}^{N}a_i\,E^{-i}\;\Big|\;a_i\in\{0,1,\dots,E-1\},\;a_1\neq0,\;b\in\mathbb Z,\;b_{\min}\le b\le b_{\max}\Big\}
SymbolBedeutungIEEE double
EEBasis22
NNAnzahl der Mantissenstellen a1…aNa_1\dots a_N5353 (52 gespeichert, a1=1a_1=1 ist implizit)
bbExponent11 Bit
bmin⁡,bmax⁡b_{\min},b_{\max}kleinster / größter Exponent≈−1022\approx -1022 / 10231023

N,E,bmin⁡,bmax⁡N,E,b_{\min},b_{\max} werden durch das Computersystem festgelegt.

Die Bedingung a1≠0a_1\neq 0 heißt normalisiert: Die erste Ziffer ist nie 0, damit jede Zahl genau eine Darstellung hat und keine Stelle verschenkt wird.

Beispiel mit E=10E=10, N=3N=3: 0.123⋅102=12.30.123\cdot10^{2}=12.3 ist eine Maschinenzahl, 12.3412.34 nicht (vier Stellen).

IEEE double (64 Bit)​

64 Bit = 1 Bit Vorzeichen + 11 Bit Exponent + 52 Bit Mantisse.

Exponent (Tafel): Mit 11 Bit lassen sich ein Vorzeichen und Exponenten von 00 bis

20+21+⋯+29=210−1=10232^0+2^1+\dots+2^9=2^{10}-1=1023

darstellen.

Korrektur zum Aufschrieb

Im Heft steht 210−1=20232^{10}-1=2023. Richtig ist 210−1=10232^{10}-1=1023.

Wertebereich und Genauigkeit (Tafel): Wegen 21023≈103082^{1023}\approx10^{308} lassen sich mit 64 Bit alle reellen Zahlen im Bereich

10−308<∣x∣<1030810^{-308}<|x|<10^{308}

mit einer relativen Genauigkeit von eps≈1.1⋅10−16\text{eps}\approx1.1\cdot10^{-16}, also etwa 16 Dezimalstellen, darstellen.

Korrektur zum Aufschrieb

Im Heft steht für die relative Genauigkeit 2−502^{-50}. Mit 52 gespeicherten Mantissenbits (plus implizite 1) ist die Maschinengenauigkeit beim Runden eps=2−53≈1.1⋅10−16\text{eps}=2^{-53}\approx1.1\cdot10^{-16}, so steht es auch auf 📄 Folie §1/2. Manche Bücher nennen den Abstand von 1 zur nächsten Maschinenzahl, 2−52≈2.2⋅10−162^{-52}\approx2.2\cdot10^{-16}, „eps“ (so z.B. DBL_EPSILON in C). In beiden Fällen: rund 16 Dezimalstellen.

Ergänzung: so ist IEEE 754 wirklich aufgebaut

Der Exponent wird nicht mit Vorzeichenbit gespeichert, sondern mit Bias 1023: gespeichert wird b+1023∈{1,…,2046}b+1023\in\{1,\dots,2046\}. Die Werte 00 und 20472047 sind für Sonderfälle reserviert (Null und subnormale Zahlen bzw. ±∞\pm\infty und NaN). Die Idee aus der Vorlesung („ein Bit für das Vorzeichen, zehn für den Betrag, also bis ≈1023\approx1023“) liefert dieselbe Größenordnung.

Das Problem: M\mathbb M ist nicht abgeschlossen​

x,y∈Maberx+y∉M(im Allgemeinen).x,y\in\mathbb M\quad\text{aber}\quad x+y\notin\mathbb M\quad\text{(im Allgemeinen)}.

Beispiel (E=10E=10, N=3N=3): x=1.23x=1.23 und y=0.00456y=0.00456 sind Maschinenzahlen, x+y=1.23456x+y=1.23456 hat zu viele Stellen. Dasselbe gilt für x⋅yx\cdot y, x/yx/y, x\sqrt x, ln⁡x\ln x, …

Rechenmodell (Tafel)​

Für die auf M\mathbb M ausgeführten Operationen +,−,⋅,÷,exp⁡,…+,-,\cdot,\div,\exp,\dots wird das korrekte Ergebnis auf die nächstgelegene Maschinenzahl gerundet:

z=x+y  ⟶  z~=rd⁡(x+y),z=ln⁡(x)  ⟶  z~=rd⁡(ln⁡(x)).\begin{aligned} z = x+y &\;\longrightarrow\; \tilde z=\operatorname{rd}(x+y),\\ z = \ln(x) &\;\longrightarrow\; \tilde z=\operatorname{rd}(\ln(x)). \end{aligned}

Der Rundungsfehler ist dabei relativ beschränkt:

rd⁡(x)=x (1+τx),∣τx∣≤eps.\operatorname{rd}(x)=x\,(1+\tau_x),\qquad|\tau_x|\le\text{eps}.

τx\tau_x heißt relativer Darstellungsfehler. Das ist das Modell, mit dem man in 1.2 weiterrechnet.

Beispiel: 5/95/9 in double (Folie §1/2)​

x=5/9=0.5555…x=5/9=0.5555\ldots wird zu rd⁡(x)=x(1+τx)=0.5…5⏟15abcd…\operatorname{rd}(x)=x(1+\tau_x)=0.\underbrace{5\ldots5}_{15}abcd\ldots Die erste unsichere Stelle ist die 16. Ziffer aa. Wie unsicher?

∣rd⁡(x)−x∣=∣a.bcd…−5.555…∣⋅10−16=∣x τx∣≤0.56⋅1.1⋅10−16≈0.7⋅10−16.|\operatorname{rd}(x)-x|=|a.bcd\ldots-5.555\ldots|\cdot10^{-16}=|x\,\tau_x|\le0.56\cdot1.1\cdot10^{-16}\approx0.7\cdot10^{-16}.

Also 5.555…−0.7≤a.bcd…≤5.555…+0.75.555\ldots-0.7\le a.bcd\ldots\le5.555\ldots+0.7, d.h. 4.85…≤a.bcd…≤6.25…4.85\ldots\le a.bcd\ldots\le6.25\ldots

⇒ Die 16. Ziffer kann nur 4, 5 oder 6 sein. Bis zur 15. Stelle ist alles sicher.

Beispiel: Assoziativität geht verloren (Folie §1/3)​

Mit E=10E=10, N=16N=16. Mathematisch sind alle vier Zeilen gleich 137137:

Rechnung (links nach rechts)Ergebnis
1020+17−10+130−102010^{20}+17-10+130-10^{20}00
1020+17−1020−10+13010^{20}+17-10^{20}-10+130120120
1020−1020+17−10+13010^{20}-10^{20}+17-10+130137137 ✔
1020+17+130−1020−1010^{20}+17+130-10^{20}-10−10-10

Warum? 1020+17=100 000 000 000 000 000 01710^{20}+17=100\,000\,000\,000\,000\,000\,017 hat 21 Stellen. Mit 16 Stellen wird daraus wieder 102010^{20}, die 1717 ist weg. Dasselbe passiert mit −10-10 und +130+130. Sobald 102010^{20} im Zwischenergebnis steckt, werden alle kleinen Summanden „verschluckt“. Erst nach −1020-10^{20} zählen sie wieder.

  • Zeile 1: alles bis −1020-10^{20} wird verschluckt ⇒ 00.
  • Zeile 2: 1717 verschluckt, danach −10+130=120-10+130=120.
  • Zeile 3: die großen Zahlen heben sich zuerst auf ⇒ exakt.
  • Zeile 4: 1717 und 130130 verschluckt, nur −10-10 überlebt.
Faustregel

Beim Summieren erst die kleinen Beträge zusammenzählen, dann die großen. Noch besser: große Zahlen mit entgegengesetztem Vorzeichen zuerst verrechnen.

Konsequenzen (Tafel)​

  • Assoziativität von ++ und ⋅\cdot ist verletzt: (a+b)+c≠a+(b+c)(a+b)+c\neq a+(b+c) am Rechner. Ebenso das Distributivgesetz.
  • Es ist sehr schwierig, auftretende Rundungsfehler exakt zu beschreiben.
  • ⇒ Man begnügt sich mit der Größenordnung der Fehler. Genau das macht die Fehlerfortpflanzung.