Zum Inhalt springen
Zurück zur Themenübersicht

Technische Informatik

Zahlen im Rechner: Stellenwertsysteme, negative Zahlen, Gleitkomma

Warum 0,1 + 0,2 im Rechner nicht genau 0,3 ergibt und wieso eine Null im Zweierkomplement zwei Darstellungen hätte.

Benötigte Grundlagen

Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.

Einführung

Tippe in fast jeder Programmiersprache 0,1+0,20{,}1 + 0{,}2 ein und lass das Ergebnis anzeigen. Heraus kommt nicht 0,30{,}3, sondern 0,300000000000000040{,}30000000000000004.

Das ist kein Fehler der Sprache und kein Defekt des Rechners. Es ist eine unvermeidliche Folge davon, wie Zahlen im Speicher stehen, und wer das versteht, vermeidet eine ganze Klasse von Fehlern.

In diesem Kapitel geht es um drei Fragen: Wie stellt ein Rechner überhaupt Zahlen dar? Wie kommen negative Zahlen dazu, wenn es nur Nullen und Einsen gibt? Und wo genau entstehen die Ungenauigkeiten?

Das kannst du nach diesem Kapitel

  • zwischen Dezimal-, Dual- und Hexadezimalsystem umrechnen.

  • erklären, warum das Hexadezimalsystem für Bitmuster besonders praktisch ist.

  • negative Zahlen im Zweierkomplement darstellen und begründen, warum diese Darstellung gewählt wurde.

  • den Zahlbereich einer festen Bitzahl bestimmen und einen Überlauf erkennen.

  • die Gleitkommadarstellung beschreiben und typische Rundungsfehler erklären (Vertiefung).

Kurz aufgefrischt

Vorausgesetzt wird aus Codierung: Zeichen, Zahlen und Bilder und Digitale Darstellung, dass jede im Rechner als Folge von vorliegt und dass sich Dezimalzahlen ins Dualsystem umrechnen lassen.

Neu ist hier alles, was über nichtnegative ganze Zahlen hinausgeht.

Stellenwertsysteme allgemein

Unser Dezimalsystem hat nichts Zwingendes an sich; die Zehn stammt von den Fingern. Allgemein gilt für ein System mit der Basis bb:

z=∑izi⋅biz = \sum_{i} z_i \cdot b^i

Jede Ziffer ziz_i liegt zwischen 00 und b−1b-1, und ihre Stelle bestimmt die Potenz.

24710=2⋅102+4⋅101+7⋅100247_{10} = 2 \cdot 10^2 + 4 \cdot 10^1 + 7 \cdot 10^0 10112=1⋅8+0⋅4+1⋅2+1⋅1=11101011_{2} = 1 \cdot 8 + 0 \cdot 4 + 1 \cdot 2 + 1 \cdot 1 = 11_{10}

Der Rechner benutzt b=2b = 2, weil sich zwei technisch zuverlässig unterscheiden lassen: Spannung liegt an oder nicht.

1011₂ Stelle für Stelle

23812240212120118 + 2 + 1 = 11

Lies die Tafel von oben nach unten: Über jeder Ziffer steht ihre Stelle als Zweierpotenz, darunter der Wert, den diese Ziffer beisteuert. Eine 0 steuert nichts bei, eine 1 den vollen Stellenwert. Unten wird aufsummiert: 8+0+2+1=118 + 0 + 2 + 1 = 11. Das ist dieselbe Rechnung, die du im Dezimalsystem längst machst, ohne es zu merken, 247=2⋅102+4⋅101+7⋅100247 = 2 \cdot 10^2 + 4 \cdot 10^1 + 7 \cdot 10^0. Nur die Basis ist eine andere, und an der Zehn ist nichts Zwingendes; sie stammt von den Fingern. Der Rechner nimmt die Zwei, weil sich zwei technisch zuverlässig unterscheiden lassen: Spannung liegt an oder nicht.

Warum zusätzlich Hexadezimal?

Dualzahlen sind für Menschen unhandlich lang. 25510255_{10} ist 11111111211111111_2; man verzählt sich sofort.

Das Hexadezimalsystem mit b=16b = 16 löst das elegant. Es braucht sechzehn Ziffern, deshalb kommen A\texttt{A} bis F\texttt{F} für 10 bis 15 dazu.

DualHexDezDualHexDez
000000100088
000111100199
0010221010A10
0011331011B11
0100441100C12
0101551101D13
0110661110E14
0111771111F15

🔴 Der entscheidende Punkt: 16=2416 = 2^4. Deshalb entspricht genau eine Hexadezimalziffer genau vier , und die Umrechnung ist reines Ablesen in Vierergruppen, ohne jede Rechnung.

1111⏟F 1111⏟F=FF16=25510\underbrace{1111}_{\texttt{F}}\ \underbrace{1111}_{\texttt{F}} = \texttt{FF}_{16} = 255_{10}

Genau deshalb siehst du Hexadezimal überall dort, wo Bitmuster gemeint sind: bei Farbangaben wie #FF8800\texttt{\#FF8800}, bei Speicheradressen und bei MAC-Adressen. Es ist keine andere , nur eine lesbarere Schreibweise derselben Bits.

Vier Bits sind eine Hexziffer

1111411114obere Vierergruppe, 4 Bitwird zur Hexziffer Funtere Vierergruppe, 4 Bitwird zur Hexziffer F1111 1111₂ = FF₁₆ = 255₁₀,dieselben Bits, dreiSchreibweisen.

Der Grund, warum das so glatt aufgeht, steht in einer einzigen Gleichung: 16=2416 = 2^4. Deshalb entspricht genau eine Hexadezimalziffer genau vier , die Umrechnung ist reines Ablesen in Vierergruppen, ohne jede Rechnung. Vergleiche das mit 25510=111111112255_{10} = 11111111_2: Bei acht Einsen verzählt man sich sofort, bei FF\texttt{FF} nicht. Und halte fest, was hier nicht passiert: Es geht keine verloren und es kommt keine hinzu. Hexadezimal ist keine andere Zahl, nur eine lesbarere Schreibweise derselben Bits. Genau deshalb siehst du es überall dort, wo Bitmuster gemeint sind, bei Farbangaben wie #FF8800\texttt{\#FF8800}, bei Speicheradressen und bei MAC-Adressen.

Negative Zahlen: das Zweierkomplement

Im Speicher gibt es kein Minuszeichen, nur . Die Darstellung negativer Zahlen muss also aus den Bits selbst hervorgehen.

Der naheliegende Weg wäre, das erste Bit als Vorzeichen zu benutzen. Diese Vorzeichen-Betrag-Darstellung hat aber zwei Nachteile:

  • Es gäbe +0+0 (0000000000000000) und −0-0 (1000000010000000), also zwei Nullen. Jeder Vergleich auf null müsste beide Fälle prüfen.
  • Die Addition würde eine Fallunterscheidung nach den Vorzeichen brauchen, also zusätzliche Schaltung.

Deshalb benutzen Rechner das Zweierkomplement. Die Bildungsregel für −x-x bei nn Bits:

Alle Bits umkehren (0 wird 1, 1 wird 0). Eins addieren.

Beispiel für −5-5 bei 8 Bit:

  5      = 0000 0101
umkehren = 1111 1010
  + 1    = 1111 1011   →  -5

Warum funktioniert das? Weil die Regel genau die Zahl erzeugt, die bei der Addition zu xx null ergibt:

  0000 0101   (  5)
+ 1111 1011   ( -5)
-----------
1 0000 0000

Das Ergebnis hat neun Stellen. Bei 8 Bit fällt die vorderste heraus, übrig bleibt 0000000000000000, also null. Genau das soll x+(−x)x + (-x) leisten.

Damit sind beide Nachteile behoben. Es gibt nur eine Null, und die Addition funktioniert für positive und negative Zahlen mit derselben Schaltung. Der Prozessor muss die Vorzeichen gar nicht ansehen.

Das vorderste Bit zeigt trotzdem das Vorzeichen an: 0 heißt nicht negativ, 1 heißt negativ. Das ist aber eine Folge der Konstruktion und nicht ihre Grundlage.

5 + (−5) muss null ergeben

1111111Ü00000101(5)+11111011(−5)100000000(0)Die neunte Stelle liegtaußerhalb der acht Bit undfällt weg: genau darauf beruhtdas Verfahren.

Hier ist die Probe darauf, dass die Bildungsregel stimmt. −5-5 entsteht aus 55 durch Umkehren aller und Addition von eins; die Behauptung ist, dass diese Zahl bei der Addition zu 55 null ergibt. Rechne die Spalten von rechts nach links mit, die stehen oben und du landest bei 1 0000 00001\,0000\,0000. Das Ergebnis hat neun Stellen, der Rechner hat aber nur acht: Die vorderste, gestrichelt eingerahmte fällt heraus, übrig bleibt 0000 00000000\,0000. 🔴 Und das ist kein hingenommener Fehler, sondern genau der Mechanismus: Bei nn Bit rechnet die Hardware ohnehin modulo 2n2^n, und das Zweierkomplement ist so gebaut, dass diese Rechnung das richtige Ergebnis liefert.

Zahlbereich und Überlauf

Bei nn gibt es 2n2^n verschiedene Bitmuster, also auch nur 2n2^n darstellbare Zahlen.

Bitsohne VorzeichenZweierkomplement
80…2550 \ldots 255−128…+127-128 \ldots +127
160…65 5350 \ldots 65\,535−32 768…+32 767-32\,768 \ldots +32\,767
320…≈4,3⋅1090 \ldots \approx 4{,}3 \cdot 10^9≈−2,1⋅109…+2,1⋅109\approx -2{,}1 \cdot 10^9 \ldots +2{,}1 \cdot 10^9

Fällt dir die Unsymmetrie auf? Bei 8 Bit reicht der Bereich von −128-128 bis +127+127, also eine negative Zahl mehr als positive. Der Grund: Die Null belegt einen der 256 Plätze, und sie zählt zur nichtnegativen Seite. Bleiben 127 positive und 128 negative.

Wird der Bereich verlassen, entsteht ein Überlauf. Bei 8 Bit im Zweierkomplement:

127+1=011111112+1=100000002=−128127 + 1 = 01111111_2 + 1 = 10000000_2 = -128

Die größte positive Zahl plus eins ergibt die kleinste negative. Der Rechner meldet das nicht von sich aus; er rechnet einfach weiter. Genau solche Überläufe stecken hinter Programmfehlern, die erst bei großen Werten auftreten, etwa bei Zeitstempeln oder Zählerständen.

Vertiefung: Gleitkommazahlen

Dieser Abschnitt gehört zum erhöhten Anforderungsniveau.

Ganze Zahlen reichen nicht. Für 3,143{,}14 oder 6,022⋅10236{,}022 \cdot 10^{23} braucht es eine andere Darstellung.

Man könnte das Komma an eine feste Stelle legen (Festkomma), etwa immer nach dem 16. . Dann ist der darstellbare Bereich aber sehr schmal: Für sehr große und sehr kleine Zahlen zugleich reicht er nicht.

Deshalb benutzt man Gleitkomma nach dem Muster der wissenschaftlichen Schreibweise:

z=(−1)V⋅M⋅2Ez = (-1)^{V} \cdot M \cdot 2^{E}

mit Vorzeichenbit VV, Mantisse MM (die Ziffernfolge) und Exponent EE (die Größenordnung). Der verbreitete Standard IEEE 754 teilt 32 Bit so auf:

TeilBits
Vorzeichen1
Exponent8
Mantisse23

Das Komma „gleitet", weil der Exponent es verschiebt. Damit lassen sich sehr große und sehr kleine Zahlen mit demselben Format darstellen.

Und hier entsteht das Problem aus der Einleitung. Die Mantisse hat endlich viele Bits, also lassen sich nur endlich viele Zahlen exakt darstellen. Entscheidend ist, welche:

Im Dezimalsystem ist 13=0,333…\tfrac{1}{3} = 0{,}333\ldots nicht endlich darstellbar, weil 3 kein Teiler von 10 ist. Im Dualsystem ist 110=0,1\tfrac{1}{10} = 0{,}1 nicht endlich darstellbar, weil 5 kein Teiler von 2 ist. Es entsteht die periodische Dualzahl

0,110=0,0001100110011…20{,}1_{10} = 0{,}0001100110011\ldots_2

Der Rechner muss abschneiden, und damit steht bereits vor jeder Rechnung ein winziger Fehler im Speicher. Bei 0,1+0,20{,}1 + 0{,}2 addieren sich zwei solche Fehler, und das Ergebnis liegt knapp neben 0,30{,}3.

🔴 Die praktische Folge ist eine feste Regel: Vergleiche Gleitkommazahlen nie mit Gleichheit. Statt a = b\texttt{a = b} prüft man ∣a−b∣<ε|a - b| < \varepsilon mit einer kleinen Schranke ε\varepsilon. Und für Geldbeträge nimmt man keine Gleitkommazahlen, sondern rechnet in Cent mit ganzen Zahlen. Cent sind ganzzahlig, also entfällt das Problem vollständig.

Ein Gleitkommaformat, maßstäblich

1823Vorzeichen V, 1 Bit0 heißt positiv, 1heißt negativExponent E, 8 Bitdie Größenordnung, erlässt das Komma gleitenMantisse M, 23 Bitdie Ziffernfolge. Hierentsteht derRundungsfehlerIEEE 754 mit 32 Bit. DieFeldbreiten im Bild sind dieBitzahlen: 1 zu 8 zu 23.

Die drei Felder sind hier maßstäblich gezeichnet, und das ist die eigentliche : Das Vorzeichen ist ein einziges , die Mantisse belegt fast drei Viertel des Formats. Genau daran liest du ab, wo das Problem aus der Einleitung sitzt. Die Mantisse hat 23 Bit, endlich viele, also lassen sich nur endlich viele Zahlen exakt darstellen. Welche, hängt von der Basis ab: Im Dezimalsystem ist 13\tfrac{1}{3} nicht endlich darstellbar, weil 3 kein Teiler von 10 ist; im Dualsystem ist 0,10{,}1 nicht endlich darstellbar, weil 5 kein Teiler von 2 ist. Der Rechner muss abschneiden, und damit steht vor jeder Rechnung schon ein winziger Fehler im Speicher. Daraus folgt die feste Regel: Gleitkommazahlen nie auf Gleichheit prüfen, sondern ∣a−b∣<ε|a - b| < \varepsilon und Geldbeträge in Cent als ganze Zahlen rechnen.

Zwischen den Systemen umrechnen

Rechne 17310173_{10} ins Dual- und ins Hexadezimalsystem um. Rechne 2F16\texttt{2F}_{16} ins Dezimalsystem.

  1. 1

    Dezimal nach Dual, Verfahren „fortlaufend durch 2 teilen": Man notiert die Reste; sie ergeben rückwärts gelesen die Dualzahl.

    173 : 2 = 86  Rest 1
     86 : 2 = 43  Rest 0
     43 : 2 = 21  Rest 1
     21 : 2 = 10  Rest 1
     10 : 2 =  5  Rest 0
      5 : 2 =  2  Rest 1
      2 : 2 =  1  Rest 0
      1 : 2 =  0  Rest 1
    
  2. 2

    Reste von unten nach oben: 10101101210101101_2.

  3. 3

    Probe: 128+32+8+4+1=173128 + 32 + 8 + 4 + 1 = 173. Stimmt.

  4. 4

    Dual nach Hex: in Vierergruppen von rechts zerlegen und jede Gruppe einzeln übersetzen.

    1010⏟A 1101⏟D  =  AD16\underbrace{1010}_{\texttt{A}}\ \underbrace{1101}_{\texttt{D}} \;=\; \texttt{AD}_{16}

    Hier ist keine Rechnung nötig, nur die Tabelle. Das ist der ganze Vorteil des Hexadezimalsystems.

  5. 5

    Hex nach Dezimal: Stellenwerte sind Potenzen von 16. 2F16=2⋅16+15⋅1=32+15=47\texttt{2F}_{16} = 2 \cdot 16 + 15 \cdot 1 = 32 + 15 = 47.

  6. 6

    Gegenprobe über Dual: 2=0010\texttt{2} = 0010, F=1111\texttt{F} = 1111, zusammen 001011112=32+8+4+2+1=4700101111_2 = 32 + 8 + 4 + 2 + 1 = 47. Beide Wege stimmen überein.

17310=101011012=AD16173_{10} = 10101101_2 = \texttt{AD}_{16} und 2F16=4710\texttt{2F}_{16} = 47_{10}.

Zweierkomplement bilden und prüfen

Stelle −37-37 als 8-Bit-Zweierkomplement dar und weise nach, dass die Darstellung richtig ist.

  1. 1

    Schritt 1: Betrag dual: 37=32+4+1=00100101237 = 32 + 4 + 1 = 00100101_2.

  2. 2

    Schritt 2: alle umkehren: 1101101011011010.

  3. 3

    Schritt 3: eins addieren:

      1101 1010
    +         1
    -----------
      1101 1011
    

    Also −37=110110112-37 = 11011011_2.

  4. 4

    Nachweis über die Summe: Die Darstellung ist genau dann richtig, wenn 37+(−37)=037 + (-37) = 0 ergibt.

      0010 0101   ( 37)
    + 1101 1011   (-37)
    -----------
    1 0000 0000
    
  5. 5

    Die neunte Stelle passt nicht in 8 Bit und fällt weg. Übrig bleibt 0000000000000000, also null. Der Nachweis ist erbracht.

  6. 6

    Zweite Probe über die Stellenwerte: Im Zweierkomplement hat das vorderste Bit den Wert −128-128. Also −128+64+16+8+2+1=−37-128 + 64 + 16 + 8 + 2 + 1 = -37. Auch das stimmt, und es zeigt, dass die Regel „umkehren und eins addieren" kein Trick ist, sondern eine Stellenwertdarstellung mit einem negativen höchsten Stellenwert.

−37=110110112-37 = 11011011_2, bestätigt durch 37+(−37)=037 + (-37) = 0 und durch die Stellenwertrechnung mit −128-128.

Typischer Fehler

„Man erkennt eine negative Zahl daran, dass das erste 1 ist, also ist 10000101210000101_2 gleich −5-5."

Der erste Teil stimmt, der zweite nicht, und die Verwechslung ist häufig.

Richtig ist: Im Zweierkomplement zeigt das vorderste Bit an, ob die Zahl negativ ist. Falsch ist die Annahme, die restlichen Bits seien der Betrag. Das wäre die Vorzeichen-Betrag-Darstellung, und die benutzen Rechner gerade nicht.

Rechne 10000101210000101_2 korrekt aus. Das vorderste Bit hat im Zweierkomplement den Stellenwert −128-128:

−128+4+1=−123-128 + 4 + 1 = -123

Oder über die Regel rückwärts: umkehren ergibt 0111101001111010, plus eins ergibt 01111011=12301111011 = 123, also war die Zahl −123-123.

−5-5 dagegen ist 11111011211111011_2, wie im Theorieteil gezeigt. Der Unterschied ist gewaltig, und er entsteht genau dort, wo man „erstes Bit = Vorzeichen" mit „Rest = Betrag" verwechselt.

Die Merkhilfe, die zuverlässig trägt: Im Zweierkomplement sind kleine negative Zahlen viele Einsen. −1-1 ist 1111111111111111, −2-2 ist 1111111011111110. Wer bei −5-5 ein Muster mit wenigen Einsen herausbekommt, hat sich verrechnet.

Übung 1

leicht

a) Rechne 1101 011021101\,0110_2 ins Dezimal- und ins Hexadezimalsystem um. b) Rechne 7B16\texttt{7B}_{16} ins Dual- und ins Dezimalsystem um. c) Wie viele verschiedene Werte lassen sich mit 12 darstellen?

Tipp anzeigen

Zu a): Zerlege in Vierergruppen von rechts.

Lösung anzeigen

a) Dezimal: 128+64+16+4+2=214128 + 64 + 16 + 4 + 2 = 214. Hexadezimal: 1101⏟D 0110⏟6=D616\underbrace{1101}_{\texttt{D}}\,\underbrace{0110}_{\texttt{6}} = \texttt{D6}_{16}. Probe: 13⋅16+6=208+6=21413 \cdot 16 + 6 = 208 + 6 = 214. Stimmt.

b) Dual: 7=0111\texttt{7} = 0111, B=1011\texttt{B} = 1011, also 0111 101120111\,1011_2. Dezimal: 7⋅16+11=112+11=1237 \cdot 16 + 11 = 112 + 11 = 123. Probe über Dual: 64+32+16+8+2+1=12364+32+16+8+2+1 = 123.

c) 212=40962^{12} = 4096 verschiedene Werte, also ohne Vorzeichen 00 bis 40954095.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    a) Zwei Umrechnungen, zwei verschiedene Zerlegungen

    Dezimal: Stellenwerte der gesetzten Bits addieren: 128+64+16+4+2=214128 + 64 + 16 + 4 + 2 = 214. Hexadezimal: in Vierergruppen von rechts zerlegen, denn 4 Bit entsprechen genau einer Hexziffer: 1101=D1101 = \texttt{D}, 0110=60110 = \texttt{6}, also D616\texttt{D6}_{16}.

    128+64+16+4+2=214128 + 64 + 16 + 4 + 2 = 214; Probe: 13⋅16+6=21413 \cdot 16 + 6 = 214

    Zwischenergebnis

    214214 dezimal, D616\texttt{D6}_{16} hexadezimal.

  2. 2

    b) Die Gegenrichtung und die Probe über zwei Wege

    Dual: Jede Hexziffer wird zu vier Bit: 7=0111\texttt{7} = 0111, B=1011\texttt{B} = 1011, also 0111 101120111\,1011_2. Dezimal: 7⋅16+11=1237 \cdot 16 + 11 = 123. Probe über den Dualweg: 64+32+16+8+2+1=12364+32+16+8+2+1 = 123 ✓

    7⋅16+11=1237 \cdot 16 + 11 = 123

    Zwischenergebnis

    0111 101120111\,1011_2 und 123123 dezimal.

  3. 3

    c) Wie viele Werte 12 Bit darstellen

    212=40962^{12} = 4096 verschiedene Werte, ohne Vorzeichen also die Zahlen 0 bis 4095.

    212=40962^{12} = 4096

    Zwischenergebnis

    0 bis 4095.

Übung 2

mittel

a) Stelle −52-52 als 8-Bit-Zweierkomplement dar. b) Welche Zahl ist 1001 011021001\,0110_2, wenn sie als 8-Bit-Zweierkomplement gelesen wird? Und welche ohne Vorzeichen? c) Nenne zwei Gründe, warum Rechner das Zweierkomplement statt der Vorzeichen-Betrag-Darstellung benutzen. d) Welchen Wert liefert 120+15120 + 15 in einem 8-Bit-Zweierkomplement-Register?

Tipp anzeigen

Zu d): Schreibe zuerst den darstellbaren Bereich auf.

Lösung anzeigen

a) 52=32+16+4=0011 0100252 = 32 + 16 + 4 = 0011\,0100_2. Umkehren: 1100 10111100\,1011. Plus eins: 1100 110021100\,1100_2. Probe: 0011 0100+1100 1100=1 0000 00000011\,0100 + 1100\,1100 = 1\,0000\,0000, nach Wegfall der neunten Stelle also null. Richtig.

b) Als Zweierkomplement: Das vorderste hat den Wert −128-128, also −128+16+4+2=−106-128 + 16 + 4 + 2 = -106. Ohne Vorzeichen: 128+16+4+2=150128 + 16 + 4 + 2 = 150. Dasselbe Bitmuster, zwei völlig verschiedene Zahlen. Welche gemeint ist, steht nicht im Speicher, sondern ergibt sich aus dem , den das Programm angibt.

c) Erstens gibt es nur eine Null; bei Vorzeichen-Betrag gäbe es +0+0 und −0-0, und jeder Vergleich auf null müsste beide Fälle prüfen. Zweitens funktioniert die Addition mit derselben Schaltung für alle Vorzeichenkombinationen, ohne Fallunterscheidung. Das spart Bauteile im Prozessor und macht die Rechnung schneller.

d) Der Bereich ist −128…+127-128 \ldots +127. 120+15=135120 + 15 = 135 liegt darüber, also gibt es einen Überlauf. Dual: 0111 1000+0000 1111=1000 01110111\,1000 + 0000\,1111 = 1000\,0111. Als Zweierkomplement gelesen ist das −128+4+2+1=−121-128 + 4 + 2 + 1 = -121. Der Rechner liefert also −121-121 und meldet nichts. Genau daran erkennt man die Gefahr: Das Ergebnis ist nicht nur falsch, sondern hat auch noch das falsche Vorzeichen.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    Teil a): Betrag zuerst, dann die Regel

    Man schreibt immer erst den positiven Betrag dual auf und wendet dann die zwei Schritte an. Wer versucht, das Ergebnis direkt zu erraten, verrechnet sich fast sicher.

    52 = 32 + 16 + 4 = 0011,0100_2

    Zwischenergebnis

    Umkehren →1100 1011\to 1100\,1011, plus eins →1100 1100\to 1100\,1100.

    Die Probe x+(−x)=0x + (-x) = 0 gehört immer dazu. Sie kostet Sekunden und findet jeden Fehler.

  2. 2

    Teil b): Dasselbe Muster, zwei Deutungen

    Das Bitmuster allein sagt nichts. Erst die Angabe „mit Vorzeichen" oder „ohne Vorzeichen" legt den Wert fest. Bei Zweierkomplement hat das höchste Bit den Wert −128-128, ohne Vorzeichen den Wert +128+128.

    -128 + 16 + 4 + 2 = -106 \qquad 128 + 16 + 4 + 2 = 150

    Zwischenergebnis

    −106-106 beziehungsweise 150150.

  3. 3

    Teil c): Zwei Gründe sauber trennen

    Der eine Grund betrifft die Eindeutigkeit (nur eine Null), der andere die Schaltung (eine Addition für alle Fälle). Beide gehören zur Antwort.

    Zwischenergebnis

    Eine Null; eine Additionsschaltung.

  4. 4

    Teil d): Erst den Bereich, dann rechnen

    Man schreibt den darstellbaren Bereich hin und prüft, ob das Ergebnis hineinpasst. Erst danach führt man die Bitaddition aus und deutet das Muster.

    0111,1000 + 0000,1111 = 1000,0111

    Zwischenergebnis

    135135 passt nicht in −128…127-128 \ldots 127, das Register zeigt −121-121.

    Beachte das Vorzeichen: Aus zwei positiven Summanden wird ein negatives Ergebnis. Genau daran erkennt die Hardware den Überlauf, und genau deshalb ist ein solcher Fehler im Programm so tückisch.

Übung 3

schwer

a) (Vertiefung) Erkläre, warum 0,10{,}1 im Dualsystem keine endliche Darstellung hat. b) (Vertiefung) Was folgt daraus für den Vergleich zweier Gleitkommazahlen? c) Ein Programm summiert 10 000 Beträge in Euro als Gleitkommazahlen. Wo liegt das Risiko, und wie vermeidet man es? d) Warum reicht der Zahlbereich bei 8 im Zweierkomplement von −128-128 bis +127+127 und nicht von −127-127 bis +127+127?

Tipp anzeigen

Zu a): Welche Nenner lassen sich in einem Stellenwertsystem zur Basis bb endlich darstellen?

Lösung anzeigen

a) In einem Stellenwertsystem zur Basis bb hat ein Bruch genau dann eine endliche Darstellung, wenn sein gekürzter Nenner nur Primfaktoren von bb enthält. Im Dezimalsystem ist b=10=2⋅5b = 10 = 2 \cdot 5, deshalb sind 12\tfrac{1}{2} und 15\tfrac{1}{5} endlich, 13\tfrac{1}{3} aber nicht. Im Dualsystem ist b=2b = 2, also ist nur die Primzahl 2 erlaubt. Der Nenner von 110\tfrac{1}{10} enthält den Faktor 5, deshalb wird die Darstellung periodisch:

0,110=0,00011‾20{,}1_{10} = 0{,}0\overline{0011}_2

Da die Mantisse endlich ist, muss der Rechner abschneiden. Der Wert im Speicher ist also schon vor jeder Rechnung minimal falsch.

b) Zwei Gleitkommazahlen dürfen nie mit Gleichheit verglichen werden. Selbst wenn zwei Rechenwege mathematisch dasselbe Ergebnis liefern, können sich die Rundungsfehler unterscheiden. Stattdessen prüft man, ob der Abstand klein genug ist:

∣a−b∣<ε|a - b| < \varepsilon

Die Schranke ε\varepsilon wählt man passend zur Größenordnung der Werte.

c) Das Risiko liegt in der Anhäufung der Rundungsfehler. Jeder einzelne Betrag ist bereits minimal falsch gespeichert, und bei 10 000 Additionen summieren sich diese Abweichungen. Am Ende kann die Summe um Cent-Beträge danebenliegen, und bei einer Abrechnung ist das nicht hinnehmbar. Verschärfend kommt hinzu, dass beim Addieren sehr unterschiedlich großer Werte kleine Beträge ganz verlorengehen können, weil sie unterhalb der der großen Zahl liegen.

Lösung: In Cent als ganze Zahlen rechnen. Cent sind ganzzahlig, ganze Zahlen werden im Zweierkomplement exakt dargestellt, und damit entfällt das Problem vollständig. Erst bei der Ausgabe teilt man durch 100. Nötig ist dann nur ein ausreichend großer Ganzzahltyp, damit kein Überlauf entsteht.

d) Mit 8 Bit gibt es 28=2562^8 = 256 verschiedene Bitmuster, also genau 256 darstellbare Zahlen. Die Null belegt eines dieser Muster, nämlich 0000 00000000\,0000. Für die positiven Zahlen bleiben damit 127 Muster (11 bis 127127) und für die negativen 128 (−1-1 bis −128-128). Der Bereich −127…+127-127 \ldots +127 hätte dagegen nur 255 Werte und ließe ein Muster ungenutzt.

Man sieht es auch an der Konstruktion: −128-128 ist 1000 00001000\,0000. Wendet man darauf die Regel an (umkehren ergibt 0111 11110111\,1111, plus eins ergibt 1000 00001000\,0000), kommt dieselbe Zahl heraus. +128+128 existiert im Bereich nicht, weshalb −128-128 die einzige Zahl ist, deren Gegenzahl sich bei 8 Bit nicht darstellen lässt.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    a) (Vertiefung) Die Regel über endliche Darstellungen

    In einem Stellenwertsystem zur Basis bb hat ein Bruch genau dann eine endliche Darstellung, wenn sein gekürzter Nenner nur Primfaktoren von bb enthält. Im Dezimalsystem ist b=10=2⋅5b = 10 = 2 \cdot 5, deshalb sind 12\tfrac{1}{2} und 15\tfrac{1}{5} endlich, 13\tfrac{1}{3} aber nicht. Im Dualsystem ist b=2b = 2, also ist nur die Primzahl 2 erlaubt, und 110\tfrac{1}{10} enthält den Faktor 5.

    0,110=0,00011‾20{,}1_{10} = 0{,}0\overline{0011}_2

  2. 2

    b) (Vertiefung) Was daraus für den Vergleich folgt

    Zwei Gleitkommazahlen dürfen nie mit Gleichheit verglichen werden. Selbst wenn zwei Rechenwege mathematisch dasselbe Ergebnis liefern, können sich die Rundungsfehler unterscheiden. Stattdessen prüft man, ob der Abstand klein genug ist: ∣a−b∣<ε|a - b| < \varepsilon.

    ∣a−b∣<ε|a - b| < \varepsilon

  3. 3

    c) Wo das Risiko bei 10 000 Additionen liegt

    Das Risiko liegt in der Anhäufung der Rundungsfehler. Jeder einzelne Betrag ist bereits minimal falsch gespeichert, und bei 10 000 Additionen summieren sich diese Abweichungen. Am Ende kann die Summe um Cent-Beträge danebenliegen, bei einer Abrechnung nicht hinnehmbar.

  4. 4

    c) Die Lösung: in Cent als ganze Zahlen rechnen

    In Cent als ganze Zahlen rechnen. Cent sind ganzzahlig, ganze Zahlen werden im Zweierkomplement exakt dargestellt, und damit entfällt das Problem vollständig. Erst bei der Ausgabe teilt man durch 100. Nötig ist dann nur ein ausreichend großer Ganzzahltyp, damit kein Überlauf entsteht.

  5. 5

    d) Warum der Bereich von −128 bis +127 reicht

    Mit 8 Bit gibt es 28=2562^8 = 256 Bitmuster, also genau 256 darstellbare Zahlen. Die Null belegt eines davon (0000 00000000\,0000). Für die positiven bleiben 127 Muster (11 bis 127127), für die negativen 128 (−1-1 bis −128-128). Der Bereich −127…+127-127 \ldots +127 hätte nur 255 Werte und ließe ein Muster ungenutzt.

    28=256=1+127+1282^8 = 256 = 1 + 127 + 128

Zusammenfassung

Jede Zahl im Rechner steht als Bitmuster, und ein Stellenwertsystem zur Basis 2 legt fest, welche Zahl gemeint ist. Das Hexadezimalsystem ist nur eine lesbarere Schreibweise derselben , praktisch deshalb, weil wegen 16=2416 = 2^4 eine Hexziffer genau vier Bits entspricht. Negative Zahlen entstehen im Zweierkomplement durch Umkehren aller Bits und Addition von eins; gewählt wurde diese Darstellung, weil sie nur eine Null kennt und weil Addition und Subtraktion damit mit einer einzigen Schaltung auskommen. Aus der festen Bitzahl folgt ein begrenzter Bereich, bei 8 Bit von −128-128 bis +127+127, unsymmetrisch weil die Null einen Platz auf der positiven Seite belegt; wird er überschritten, entsteht ein Überlauf, der nicht gemeldet wird. Gleitkommazahlen speichern Vorzeichen, Mantisse und Exponent und können deshalb sehr große und sehr kleine Werte darstellen, allerdings nur endlich viele exakt. Da 0,10{,}1 im Dualsystem periodisch ist, entstehen Rundungsfehler schon beim Speichern, weshalb man Gleitkommazahlen nie auf Gleichheit prüft und Geldbeträge in Cent als ganze Zahlen rechnet.