Endliches Alphabet:
b-adische Zahlen mit endlicher Wortlänge n: \(\sum_{b}^{n}{ }\)
Wichtige Zahlensysteme in der Informatik:
\[ z=\sum_{i=0}^{n−1}{{z}_{i}{b}^{i}} \]
mit \({z}_{i}\in\sum_{b}{=\left\{0,1,\ldots,b−1\right\}}\) für \(i=0,1,\ldots,n−1\).
\[ z={\left({z}_{n−1}{z}_{n−2}\ldots{z}_{1}{z}_{0}\right)}_{b} \]
Wichtiger Spezialfall: \(b=2\) („Binärdarstellung“ natürlicher Zahlen)
\[ z=\sum_{i=0}^{3}{{2}^{i}\cdot{z}_{i}={2}^{0}\cdot0+{2}^{1}\cdot1+{2}^{2}\cdot1+{2}^{3}\cdot0=6} \]
\[ {z}_{max}=\sum_{i=0}^{n−1}{{2}^{i}={2}^{n}−1} \]
| Ziffer | 0 | 1 | … | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Wert | 0 | 1 | … | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
\[ w=\sum_{i=0}^{n−1}{{z}_{i}{b}^{i}={z}_{0}+b\cdot({z}_{1}+b\cdot({z}_{2}+\ldots\left(b\cdot\left({z}_{n−3}+b\cdot\left({z}_{n−2}+b\cdot{z}_{n−1}\right)\right)\ldots\right))} \]
\(\frac{w}{b}={z}_{1}+b\cdot({z}_{2}+\ldots\left(b\cdot\left({z}_{n−3}+b\cdot\left({z}_{n−2}+b\cdot{z}_{n−1}\right)\right)\ldots\right))\) Rest \({z}_{0}\)
\(\frac{{w}_{1}}{b}={z}_{2}+\ldots\left(b\cdot\left({z}_{n−3}+b\cdot\left({z}_{n−2}+b\cdot{z}_{n−1}\right)\right)\ldots\right))\) Rest \({z}_{1}\)
\(\frac{{w}_{n−2}}{b}={z}_{n−1}\) Rest \({z}_{n−2}\)
\(\frac{{w}_{n−1}}{b}=0\) Rest \({z}_{n−1}\)
Beispiel: \({\left(2595\right)}_{10}\) nach Basis 11
\[ \frac{{\left(2595\right)}_{10}}{11}={\left(235\right)}_{10} \]
\[ \frac{{\left(235\right)}_{10}}{11}={\left(21\right)}_{10} \]
Rest: \({\left(10\right)}_{10}={\left(A\right)}_{11}\)
Rest: \({\left(4\right)}_{10}={\left(4\right)}_{11}\)
\[ \frac{{\left(21\right)}_{10}}{11}={\left(1\right)}_{10} \]
\[ \frac{{\left(1\right)}_{10}}{11}={\left(0\right)}_{10} \]
Rest: \({\left(10\right)}_{10}={\left(A\right)}_{11}\)
Rest: \({\left(1\right)}_{10}={\left(1\right)}_{11}\)
\[ {\left(2595\right)}_{10}={\left(1A4A\right)}_{11} \]
Eingabe: natürliche Zahl z, Basis b > 1
Ausgabe: Ziffern z_(n-1) ... z_1 z_0 zur Basis b
i := 0
wiederhole
z_i := z mod b // Rest = nächste Ziffer
z := z div b // ganzzahliger Quotient
i := i + 1
solange z > 0
Ergebnis: (z_(i-1) ... z_1 z_0)_b
47 : 2 = 23 Rest 1
23 : 2 = 11 Rest 1
11 : 2 = 5 Rest 1
5 : 2 = 2 Rest 1
2 : 2 = 1 Rest 0
1 : 2 = 0 Rest 1
\[(47)_{10} = ( ? )_2\]
\[ z = 2 \cdot 16^2 + 10 \cdot 16^1 + 15 \cdot 16^0 = 512 + 160 + 15 = (687)_{10} \]
\[ \begin{array}{rr} &0011\\ +&0010\\ \hline &0101 \end{array} \]
\[ \begin{array}{rrr} 3&=&2^0+2^1\\ 2&=&2^1\\ \hline 5&=&2^0+2^2 \end{array} \]
Beispiel: Was geschieht bei \(15 + 2\)?
\[ \begin{array}{rr} &1111\\ +&0010\\ \hline &0001 \end{array} \]
\[ \begin{array}{rrr} 15&=&2^0+2^1+2^2+2^3\\ 2&=&2^1\\ \hline 1&=&2^1 \end{array} \]
\[ 1=\left(15+2\right) mod {2}^{4} \]
Schulmethode:
Sei \(x\) der Multiplikand, \(y=({y}_{n−1},\ldots,{y}_{0})\) der Multiplikator, dann ist
\[ x\cdot{}y=x\cdot{y}_{0}+x\cdot{y}_{1}\cdot2+x\cdot{y}_{2}\cdot{2}^{2}+\ldots+x\cdot{y}_{n−1}\cdot{2}^{n−1} \]
\[ =\sum_{i=0}^{n−1}{x\cdot{y}_{i}\cdot{2}^{i}} \]
\[ x\cdot{}y=\left(\ldots\left(\left(x\cdot{y}_{0}+x\cdot{y}_{1}\cdot2\right)+x\cdot{y}_{2}\cdot{2}^{2}\right)+\ldots\right)+x\cdot{y}_{n−1}\cdot{2}^{n−1} \]
Ganze Zahlen
Bisher wurden nur natürliche Zahlen betrachtet. Wie sollte man ganze Zahlen darstellen?
Der konzeptionell einfachste Ansatz:
Dualdarstellung wie bisher plus Vorzeichen-Bit
0 = +, 1 = -, Bsp. +5 = 0101, -5 = 1101
Nachteile: 0 hat zwei Darstellungen und man braucht sowohl Addier- als auch Subtrahierwerk:
Nachteile der vorzeichenlosen Version Verwendung von K1(x) und K2(x)
| 1. | +x, +y | x+y | Add. |
| 2. | -x,-y | -(x+y) | Add. |
| 3. | +x, -y (x ≥ y) | x-y | Subtr. |
| -x, +y (y ≥ x) | y-x | Subtr. | |
| 4. | +x, -y (x < y) | -(y-x) | Subtr. |
| -x, +y (y < x) | -(x-y) | Subtr. |
| \(z\) | \(z+8\) | Bitfolge |
|---|---|---|
| \(-8\) | \(0\) | 0000 |
| \(-3\) | \(5\) | 0101 |
| \(0\) | \(8\) | 1000 |
| \(+5\) | \(13\) | 1101 |
| \(+7\) | \(15\) | 1111 |
Sei \(x={\left({x}_{n−1}\ldots{x}_{0}\right)}_{2}\in\) \(\sum_{2}^{n}{ }\)eine \(n\)-stellige Binärzahl.
\({K}_{1}\left(x\right)≔{\left(\overline{{x}_{n−1}},\ldots,\overline{{x}_{0}} \right)}_{2}\) heißt Einer-Komplement von \(x\)
\({K}_{2}\left(x\right)≔{\left(\overline{{x}_{n−1}},\ldots,\overline{{x}_{0}}\right)}_{2}+1={K}_{1}\left(x\right)+1 \left(modulo\right) {2}^{n}\) heißt Zweier-Komplement von \(x\)
Beispiel: \(x\) = 10110010: \({K}_{1}\left(x\right)=01001101\) \({K}_{2}\left(x\right)=01001110\)
Beispiel: \(x\) \(=10110010\)
\({K}_{1}(x)\) \(=01001101\)
Beispiel: \(x\) \(=10110010\)
\({K}_{1}(x)\) \(=01001101\)
\({K}_{2}(x)\) \(=01001110\)
Das MSB legt das Vorzeichen fest
\({\left(0???\right)}_{2}\)
\({\left(1???\right)}_{2}\)
\[ (0010)_2 = +(010)_2 = (2)_{10} \]
\[ (1010)_2=-K_1(1010)_2 = -(0101)_2 = -(5)_10 \]
Beispiel: \((3)_{10}+(-6)_{10}=(-3)_{10}\)
\((3)_{10}=(0011)_2\)
\(-{6}_{10}=K_1(0110)_2=(1001)_2\)
\[ \begin{array}{rr} &0011\\ +&1001\\ \hline &1100 \end{array} \]
\[ (1100)_2=-K_1(1100)_2=-(0011)_2=-(3)_{10} \]
\((0???)_{2}\): wird interpretiert wie im vorzeichenlosen Fall
\((1???)_{2}\): Bilde Zweierkomplement \({K}_{2}\)
Beispiel:
\((0010)_2 = +(010)_2 = (2)_{10}\)
\((1010)_2 = -K_2(1010)_2 = -(0101 + 1)_2 = -(6)_{10}\)
\({K}_{2}({K}_{2}(x))= x\)
Beispiel: \((3)_{10}+(−6)_{10}= -(3)_{10}\)
\((3)_{10} = (0011)_2\)
\(-(6)_{10} = K_2(0110)_2 = (1001 + 1)_2 = (1010)_2\)
\[ \begin{array}{rr} &0011\\ +&1010\\ \hline &1101 \end{array} \]
Vorzeichenlos:
\((0)_{10} \cdot\cdot\cdot (15)_{10}\)
Einerkomplement:
\(-(7)_{10} \cdot\cdot\cdot (7)_{10}\)
Zweierkomplement:
\(-(8)_{10} \cdot\cdot\cdot (7)_{10}\)
Sei \(x=({x}_{n−1}\ldots{x}_{0})_{2}\in{B}^{n}\) eine \(n\)-stellige Binärzahl.
Im Einerkomplement: \(−\left({2}^{n−1}−1\right)\leq{}x\leq{2}^{n−1}−1\)
Im Zweierkomplement: \({−2}^{n−1}\leq{}x\leq{2}^{n−1}−1\)
| Bitfolge | Darstellung in Dezimalnotation | ||
|---|---|---|---|
| Vorz./Betrag | K1 | K2 | |
| 0000 | +0 | +0 | +0 |
| 0001 | +1 | +1 | +1 |
| 0010 | +2 | +2 | +2 |
| 0011 | +3 | +3 | +3 |
| 0100 | +4 | +4 | +4 |
| 0101 | +5 | +5 | +5 |
| 0110 | +6 | +6 | +6 |
| 0111 | +7 | +7 | +7 |
| 1000 | -0 | -7 | -8 |
| 1001 | -1 | -6 | -7 |
| 1010 | -2 | -5 | -6 |
| 1011 | -3 | -4 | -5 |
| 1100 | -4 | -3 | -4 |
| 1101 | -5 | -2 | -3 |
| 1110 | -6 | -1 | -2 |
| 1111 | -7 | -0 | -1 |
| kleinste Zahl | größte Zahl | \(n=4\) | Vorteile | Nachteile | |
|---|---|---|---|---|---|
| Vorzeichen/ Betrag | \({-(2^{n-1}-1)}\) | \({2^{n-1}-1}\) | \(-7\ldots 7\) | intuitiv; Negation durch Kippen des Vorzeichenbits | zwei Darstellungen der 0; Addier- und Subtrahierwerk nötig |
| Einerkomplement | \({-(2^{n-1}-1)}\) | \({2^{n-1}-1}\) | \(-7\ldots 7\) | Negation durch Invertieren; Subtraktion als Addition | zwei Darstellungen der 0; Übertrag muss bei der Addition zurückgeführt werden |
| Zweierkomplement | \({-2^{n-1}}\) | \({2^{n-1}-1}\) | \(-8\ldots 7\) | eindeutige 0; Addition wie vorzeichenlos; Standard in Rechnern | asymmetrisch (\(-2^{n-1}\) hat kein positives Gegenstück); Negation: Invertieren \(+1\) |
| Exzess-\(2^{n-1}\) | \({-2^{n-1}}\) | \({2^{n-1}-1}\) | \(-8\ldots 7\) | eindeutige 0; Vergleich wie vorzeichenlos | Addition braucht Korrektur um \(q\); 0 ist nicht \(00\ldots0\) |
Binary Coded Decimal
Beispiel: 4739 = 0100 0111 0011 1001
Nachteil: Erschwerte Addition
| 0100 | 0111 | 0011 | 1001 |
| 0001 | 0010 | 1000 | 0111 |
| 0101 | 1001 | 1100 | 0000 |
Beispiel: 4739 + 1287 = 6026
Z.B. Fehler an der letzten Stelle wegen des Übertrags.
| 0101 | 1001 | 1100 | 0000 |
| 0110 | |||
| 0101 | 1001 | 1100 | 0110 |
| 0110 | |||
| 0101 | 1010 | 0010 | 0110 |
| 0110 | |||
| 0110 | 0000 | 0010 | 0110 |
| 6 | 0 | 2 | 6 |
Festkommazahlen
Festkomma-Darstellung
Komma rechts von der Stelle mit dem niedrigsten Wert:
ein \(n\)-Bit Wort \(({z}_{n−1}\ldots{z}_{0})_{2}\) stellt dann die Zahl
\(z=\sum_{i=0}^{n−1}{{z}_{i}\cdot{2}^{i}}\) dar, z.B. 110101.0
Komma links von der Stelle mit dem höchsten Wert:
ein \(n\)-Bit Wort \(({x}_{1}\ldots{x}_{n})_{2}\) stellt dann die Zahl
\(z=\sum_{i=1}^{n}{{z}_{i}\cdot{2}^{−i}}\) dar, z.B. 0.110101
Allgemein stellt eine Bitfolge \(({x}_{n−1},\ldots,{x}_{1},{x}_{0},{x}_{−1},\ldots,{x}_{−m})_{2}\),
falls das Komma zwischen \({x}_{0}\) und \({x}_{−1}\) angenommen wird, die Zahl
\(z=\sum_{i=−m}^{n−1}{{z}_{i}\cdot{2}^{i}}\) dar, z.B. 1101.01
Verwende 4 Bits für Vor- und 3 Bits für Nachkommateil
\(3.5+2.5\) \(=\left(0011\right).\left(100\right)+\left(0010\right).\left(100\right)\)
\(=\left(0110\right).\left(000\right)\)
\(=6.0\)
\[ \begin{array}{lllll} 0{,}6875 & \cdot 2 & = & 1 & {,}375\\ 0{,}375 & \cdot 2 & = & 0 & {,}75\\ 0{,}75 & \cdot 2 & = & 1 & {,}5\\ 0{,}5 & \cdot 2 & = & 1 & {,}0\\ 0 \end{array} \]
Gleitkommazahlen
Jede Zahl \(z\) wird in der Form \(z=\pm{}m\cdot{b}^{\pm{}e}\) dargestellt mit \(m\) Mantisse, \(e\) Exponent, \(b\) Basis für den Exponenten.
Die Basis ist für alle auftretenden Exponenten die gleiche; daher rechnerinterne Darstellung einer Gleitkomma-Zahl:
\[ (\pm{}m,\pm{}e) \]
Speicherung einer Gleitkomma-Zahl in drei Feldern
Bei 32-Bit haben wir \(k=8\) und \(n=23\)
Bei 64-Bit haben wir \(k=11\) und \(n=52\)
Drei Fälle: normalisiert, denormalisiert und Sonderzahlen
Vorzeichen \(\hat{s}\) der Mantisse
\(1.18\cdot{10}^{−38}\) bis \(3.40\cdot{10}^{38}\)
\[ 10111111110000000000000000000000 \]
\[ \hat{s}=1 \] \[ \begin{array}{rcl} \hat{e}&=&01111111\\ \hat{m}&=&10000000000000000000000 \end{array} \]
\[ s=1 \] \[ e=\hat{e}−127=0 \] \[ m=1.\hat{m}=1.5 \]
Normalisieren: \((10,101)_2 = (1,0101)_2 \cdot (2)^1\)
m̂ = 01010… - Exponent: e = ê -127 ↔︎ ê = e + 127
ê \(= 1 + 127 = 128 = (10000000)_2\)
···
\(0\ 10110011\ 010100...0000\)
Stelle \(z=12{,}375\) als IEEE 754 Gleitkommazahl dar:
\[ \underbrace{0}_{\hat{s}}\ \underbrace{10000010}_{\hat{e}}\ \underbrace{10001100000000000000000}_{\hat{m}} \;=\; (\mathrm{41460000})_{16} \]
Welche Zahl wird durch \((\mathrm{C1A40000})_{16}\) dargestellt?
Durch \(1−bias\) statt \(0−bias\) sanfter Übergang zwischen denormalisiert und normalisiert
Kleinste normalisierte Zahl (Betrag)
Größte denormalisierte Zahl (Betrag)
\[ \begin{array}{rcl} \hat{m}&=&\left(0\ldots0\right)\\ \hat{e}&=&(0\ldots1) \end{array} \]
\[ \Rightarrow \]
\[ 1.0\cdot{2}^{−126} \]
\[ \begin{array}{rcl} \hat{m}&=&\left(1\ldots1\right)\\ \hat{e}&=&(0\ldots0) \end{array} \]
\[ (0.11111111111111111111111)_{2}\cdot{2}^{−126} \] \[ =(0.99999988079071044921875)_{10}\cdot{2}^{−126} \]
\[ \left.\begin{pmatrix}\hat{s}=0 \\ \hat{m}=\left(0\ldots0\right) \\ \hat{e}=\left(0\ldots0\right)\end{pmatrix}\right\}\Rightarrow+0 \]
\[ \left.\begin{pmatrix}\hat{s}=1 \\ \hat{m}=\left(0\ldots0\right) \\ \hat{e}=\left(0\ldots0\right)\end{pmatrix}\right\}\Rightarrow−0 \]
Überlauf: Das Resultat einer Gleitkomma-Operation ist zu groß, um es darzustellen (bzw. zu klein, dann Unterlauf)
Das Ergebnis einer solchen Gleitkomma-Operation wird durch „infinity“ gekennzeichnet, Symbole \(+\infty\) oder \(−\infty\)
Beispiel:
\[ \frac{1}{0}=+\infty \]
\[ \frac{1}{−0}=−\infty \]
\[ +\infty+\left(−\infty\right)=NaN \]
Es können nicht alle Zahlen dargestellt werden
Beispiel: \((0.1)_{10}\)
Nächstkleinere Zahl
\(\hat{s}=0 (1.10011001100110011001101)_{2}\cdot{2}^{−4}\)
\(\hat{e}=\left(01111011\right) =0.100000001490116119384765625\) \[ \hat{m}=(10011001100110011001101) \]
\[ (1.10011001100110011001100)_{2}\cdot{2}^{−4} \] \[ =0.0999999940395355224609375 \]
\[ \hat{s}=0 \] \[ \hat{e}=\left(01111011\right) \] \[ \hat{m}=(10011001100110011001100) \]
float a = 0.1; float b = 0.3;
if (a == 0.1) ergibt true
Aber if (a+b == 0.4) ergibt false
Daher Vergleich mit Epsilon-Umgebung nötig
Seien \(x={m}_{x}\cdot{2}^{{d}_{x}}\)
\(y={m}_{y}\cdot{2}^{{d}_{y}}\)
Falls \({d}_{x}\leq{d}_{y}\) dann
\[ \begin{array}{rcl} x+y&=&\left({m}_{x}\cdot{2}^{{d}_{x}−{d}_{y}}+{m}_{y}\right)\cdot{2}^{{d}_{y}}\\ x−y&=&\left({m}_{x}\cdot{2}^{{d}_{x}−{d}_{y}}−{m}_{y}\right)\cdot{2}^{{d}_{y}} \end{array} \]
Seien \(x={m}_{x}\cdot{2}^{{d}_{x}}\)
\(y={m}_{y}\cdot{2}^{{d}_{y}}\)
Falls \({d}_{x}\leq{d}_{y}\) dann
\[ \begin{array}{rcl} x+y&=&\left({m}_{x}\cdot{2}^{{d}_{x}−{d}_{y}}+{m}_{y}\right)\cdot{2}^{{d}_{y}}\\ x−y&=&\left({m}_{x}\cdot{2}^{{d}_{x}−{d}_{y}}−{m}_{y}\right)\cdot{2}^{{d}_{y}} \end{array} \]
\[ \frac{x}{y}=\frac{{m}_{x}}{{m}_{y}}\cdot{2}^{{d}_{x}−{d}_{y}} \]
Berechne \(x+y\) für
\[ \begin{array}{rcl} x &=& \underbrace{1}_{\hat{s}}\ \underbrace{10000001}_{\hat{e}}\ \underbrace{10100000000000000000000}_{\hat{m}}\\ y &=& \underbrace{1}_{\hat{s}}\ \underbrace{10000000}_{\hat{e}}\ \underbrace{11100000000000000000000}_{\hat{m}} \end{array} \]
Probe: \(x=-6{,}5\), \(y=-3{,}75\) \(\Rightarrow\) \(x+y=-10{,}25=-(1{,}01001)_2\cdot 2^{3}\) ✓
Berechne \(x\cdot y\) für
\[ \begin{array}{rcl} x &=& \underbrace{0}_{\hat{s}}\ \underbrace{10000010}_{\hat{e}}\ \underbrace{10000000000000000000000}_{\hat{m}}\\ y &=& \underbrace{1}_{\hat{s}}\ \underbrace{01111101}_{\hat{e}}\ \underbrace{01000000000000000000000}_{\hat{m}} \end{array} \]
Probe: \(x=12\), \(y=-0{,}3125\) \(\Rightarrow\) \(x\cdot y=-3{,}75=-(1{,}111)_2\cdot 2^{1}\) ✓
Vorzeichen: 1 Bit
Exponent: 3 Bits
Mantisse: 2 Bits
Weicher Übergang zwischen normalisierten und denormalisierten Werten
Präzise Verteilung um die 0
Genau wie bei den vorgestellten 32-Bit Gleitkomma-Zahlen, jedoch:
Außerdem beschreibt IEEE 754 auch 80-Bit Gleitkomma-Zahlen mit 15-Bit Exponenten und 64-Bit Mantisse
x86-Architekturen verwenden interne 80-Bit Darstellung, Speicherung erfolgt in 32- oder 64-Bit
64-Bit Gleitkomma-Zahlen werden auch als double bezeichnet.
Mit \(x,y\in{}R\) ist das Ergebnis einer IEEE 754 Operation
\(∘ \in{+,−,\cdot,\frac{ }{} }\)definiert als \(round(x∘y)\)
IEEE 754 definiert nicht, wie exakt gerundet werden muss, sondern liefert Alternativen
D.h. die gleichen 32-Bit FP-Operationen können unterschiedliche Ergebnisse liefern, obwohl korrekt (den Standard befolgend)
| Modus | 1.40 | 1.60 | 1.50 | 2.50 | -1.50 |
|---|---|---|---|---|---|
| Round to nearest (tie to even) | 1 | 2 | 2 | 2 | -2 |
| Round to nearest (tie away from zero) | 1 | 2 | 2 | 3 | -2 |
| Round toward zero | 1 | 1 | 1 | 2 | -1 |
| Round down | 1 | 1 | 1 | 2 | -2 |
| Round up | 2 | 2 | 2 | 3 | -1 |
Zusammenfassung
Quelle: http://www.capcomespace.net/dossiers/espace_europeen/ariane/ariane5/AR501/V88_AR501.htm
W. Kahan: An Interview with the Old Man of Floating-Point (https://people.eecs.berkeley.edu/~wkahan/ieee754status/754story.html)
D. Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. 23, 1991, S. 5-48 (http://docs.sun.com/source/806-3568/ncg_goldberg.html)
R. Bryant, D. O‘Hallaron: Computer Systems – A Programmer‘s Perspective (Chapter 2). Prentice Hall