Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
Einstieg in die Informatik mit JavaZahldarstellung und Rundungsfehler
Gerd Bohlender
Institut fur Angewandte und Numerische Mathematik
1 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
2 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
3 / 34
Uberblick
In diesem Kapitel wird beschrieben, wie ganze Zahlen undGleitkommazahlen dargestellt und bearbeitet werden.
Ganze ZahlenDarstellung in Stellenwertsystem
GleitkommazahlenZahldarstellung nach Standard IEEE 754
FehlermoglichkeitenMogliche Fehler die beim Rechnen mit ganzen Zahlen undGleitkommazahlen auftreten konnen
RundungsfehlerRundungsfehler bei einzelnen Operationen und Auswirkungenin Programmen
4 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
5 / 34
Darstellung ganzer Zahlen, Stellenwertsystem
Gegeben sei eine ganzzahlige ”Basis“ b > 1. Jede endlicheganze Zahl x kann durch ihre ”b-adische Entwicklung“ imStellenwertsystem dargestellt werden
x = ±n∑
i=0
xi · bi = ±xnxn−1 . . . x2x1x0
Hierbei ist n ≥ 0 und xi eine der Ziffern 0 bis b − 1.Ist xn 6= 0, dann ist n + 1 die Stellenzahl zur Basis b.Neben dem Dezimalsystem (b = 10) werden in der Informatikhaufig verwendet• das Dualsystem (Binarsystem, b = 2)• das Hexadezimalsystem (b = 16)• in alteren Anwendungen auch das Oktalsystem (b = 8)
6 / 34
Darstellung ganzer Zahlen, Ziffern
Als ”Ziffern“ fur Basen b > 10 werden Buchstaben verwendet:A = 10, B = 11, ..., F = 15, ..., Z = 35
Groß- und Kleinbuchstaben werden nicht unterschieden.
Um Verwechslungen mit der Basis b zu vermeiden, verwendenwir hier vorzugsweise Großbuchstaben fur die Ziffern.
7 / 34
Darstellung ganzer Zahlen, Basis
Die Basis b wird in mathematischer Schreibweise als Indexangehangt, z.B.:
10102 = 1010, A016 = 16010
In Java wird bei Literalkonstanten die Basis durch den Prafix 0xfur Hexadezimalzahlen, 0 fur Oktalzahlen und ohne Prafix furDezimalzahlen gekennzeichnet, z.B.:
i n t i = 0123; / / Okta lzah l , dezimaler Wert 83i n t j = 0x100 ; / / Hexadezimalzahl , Wert 256i n t k = 0xAB ; / / 10∗16 + 11 = 171
8 / 34
Darstellung ganzer Zahlen, Basis
Werte mit anderer Basis (i.a. im Bereich 2 bis 36) konnen inJava als String geschrieben werden. Die Umwandlung erfolgtdurch Angabe der Basis als zweiter Parameter einerUmwandlungsfunktion.
Umwandlung String in interne Darstellung mit StandardfunktionInteger.parseInt (wert, basis)
i n t i = I n tege r . pa rse In t ( ” 100 ” , 16 ) ; / / 256i n t j = I n tege r . pa rse In t ( ” 100 ” , 2 ) ; / / 4
Umgekehrt Umwandlung interne Darstellung in String mitStandardfunktion Integer.toString (wert, basis)
S t r i n g s ;s = In tege r . t o S t r i n g (160 , 16 ) ; / / e r g i b t ”A0”s = In tege r . t o S t r i n g (9 , 2 ) ; / / e r g i b t ”1001”s = In tege r . t o S t r i n g (35 , 36 ) ; / / e r g i b t ”Z ”
9 / 34
Darstellung ganzer Zahlen, Umrechnung
Umrechnung von Basis b in Dezimalsystem: Formel auswerten.ABC16 = A · 16 · 16 + B · 16 + C
= 10 · 256 + 11 · 16 + 12= 2560 + 176 + 12= 274810
110012 = 1 · 2 · 2 · 2 · 2 + 1 · 2 · 2 · 2 + 0 · 2 · 2 + 0 · 2 + 1= 16 + 8 + 1= 2510
Multiplikationen sparen: Potenzen von b ausklammern!567816 = ((5 · 16 + 6) · 16 + 7) · 16 + 8
= ((80 + 6) · 16 + 7) · 16 + 8= (1376 + 7) · 16 + 8= 22128 + 8= 2213610
(allgemeines Verfahren: ”Hornerschema“)
10 / 34
Darstellung ganzer Zahlen, Umrechnung
Umrechnung in Basis b: Ziffern abdividieren. Beispiel:
i n t w = 100; / / Werti n t b = 8; / / BasisS t r i n g s = ” ” ; / / am Anfang l e e r e r S t r i n gwhile (w > 0) { / / berechnet 4 , 4 , 1
i n t z = w % b ; / / n iede rs te Z i f f e r bestimmens = z + s ; / / vor s davor haengenw = w / b ; / / von w abd i v i d i e ren
}/ / e r g i b t s = ”144”
Bei Basis b > 10 mussen ggf. Ziffern in die entsprechendenDarstellungen umgewandelt werden (Fallunterscheidung).
Als alternativer Algorithmus konnen auch die hochsten Ziffernzuerst bestimmt werden durch Vergleich mit Potenzen bk .
11 / 34
Darstellung in festem Zahlformat, negative Zahlen
In den Java-Datentypen byte, short, int, long wird die Basisb = 2 und eine feste Anzahl von n = 8, 16, 32, 64 Bits (binarenZiffern) eingesetzt.
• 1 Bit Vorzeichen (0 = Plus, 1 = Minus)• n − 1 Bits fur den Wert
Negative Werte werden im ”Zweier-Komplement“ dargestellt;den Absolutbetrag einer negativen Zahl berechnet man:• alle Bits negieren (0 ↔ 1)• 1 addieren
12 / 34
Zahlbereich
Mit n Bits ist der Bereich −bn−1 . . . bn−1 − 1 darstellbar.Ausnahme: char ist ein vorzeichenloser Datentyp.
Typ n min maxbyte 8 −27 27 − 1short 16 −215 215 − 1int 32 −231 231 − 1long 64 −263 263 − 1char 16 0 216 − 1
13 / 34
Beispiel: Positive und negative Bytes
Beispiel byte
Bits Wert00000000 000000001 100000010 200000011 3. . . . . .01111111 12710000000 -12810000001 -127. . . . . .11111110 -211111111 -1
14 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
15 / 34
Uberlauf, Beispiel byte
Wird der darstellbare Bereich uberschritten (z.B. bei byteWerte < −128 oder > 127), dann entsteht ein Uberlauf.Achtung: Uberlauf wird in Java nicht erkannt, es wird ohneWarnung weitergerechnet!Berechnetes Ergebnis = untere n Bits des korrekten Ergebnis,also ±k · bn
Beispiel mit byte, berechnetes Ergebnis ist exaktes Ergebnis±k · 256:
Ausdruck erwartet berechnet127 + 1 128 -128127 + 2 129 -127100 · 2 200 -56100 · 5 500 -12
Das gleiche Problem tritt bei den anderen ganzzahligenDatentypen short, int, long, char auf, beim Uberschreiten derjeweiligen maximalen / minimalen darstellbaren Werte.
16 / 34
Explosion der Ariane 5 Rakete
Uberlauf kann zu katastrophalen Fehlern fuhren. Dieeuropaische Rakete Ariane 5 wurde beim Erstflug am 4. Juni1996 zerstort.Ablauf (siehe http://de.wikipedia.org/wiki/Ariane_V88):
• Steuersoftware (in Ada geschrieben) fur Ausrichtung derInertialplattform, wichtig fur Lagesteuerung
• Umwandlung einer 64-Bit-Gleitkomma-Variable in einevorzeichenbehaftete 16-Bit-Ganzzahl
• Uberlauf fuhrt zu starker Neigung der Rakete nach 37Sekunden Flug
• Zerstorung der Rakete nach weiteren 3 Sekunden in 4 kmHohe
• Verlust 290 Millionen Euro, keine Personenschaden
Steuersoftware war von Ariane 4 ubernommen, hat dortfunktioniert. Aber in Ariane 5 traten großere Werte auf.
17 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
18 / 34
Darstellung reeller Zahlen
Gegeben sei eine ganzzahlige ”Basis“ b > 1. Jede endlichereelle Zahl x kann durch ihre ”b-adische Entwicklung“ imStellenwertsystem dargestellt werden
x = ±n∑
i=−∞xi · bi = ±xnxn−1 . . . x2x1x0.x−1x−2x−3 . . .
Hierbei ist n ≥ 0 und xi eine der Ziffern 0 bis b − 1.
Ist xn 6= 0, dann ist n + 1 die Stellenzahl vor dem Dezimalpunkt(Komma) zur Basis b. Die Stellenzahl hinter dem Dezimalpunktist i.a. unendlich.
Die Darstellung ist i.a. nicht eindeutig, z.B. ist1.000 . . . = 0.999 . . .
Verwendete Basis ist meistens b = 10 oder b = 2.
19 / 34
Darstellung von Gleitkommazahlen
Im Computer werden reelle Zahlen durch Gleitkommazahlenmit endlicher Genauigkeit approximiert. Darstellung durch eine
”Mantisse“ m der Form x0.x1x2 . . . xn mit Mantissenlange n + 1und einen ”Exponenten“ emin ≤ e ≤ emax :
x = ±n∑
i=0
xi · b−i · be = ±x0.x1x2 . . . xn · be
Ist x0 6= 0, dann heißt die Zahl ”normalisiert“, sonst
”denormalisiert“.Die Java-Datentypen float bzw. double sind wie imIEEE-Standard 754 definiert (siehehttp://de.wikipedia.org/wiki/IEEE_754). Basis b = 2,insgesamt 32 bzw. 64 Bits (binaren Ziffern).
• 1 Bit Vorzeichen (0 = Plus, 1 = Minus)• 8 bzw. 11 Bits fur den Exponenten bei float bzw. double• restliche 23 bzw. 52 Bits fur die Mantisse
20 / 34
Darstellung negativer Gleitkommazahlen, Details
Negative Werte werden in Vorzeichen-Betragsdarstellungdargestellt; die Mantisse m enthalt den Absolutbetrag der Zahl.
Im Binarsystem ist bei normalisierten Zahlen die Ziffer x0 immer= 1, braucht also nicht gespeichert zu werden (”Hidden Bit“).Die Mantisse hat dann 24 bzw. 53 Bit bei float bzw. double
Zum Exponenten wird intern ein ”Bias“ addiert, so dass er ≥ 0wird.
Zahlen mit dem maximalen Exponenten emax stellen ±∞ bzw.NaN (not a number) dar.
Zahlen mit dem minimalen Exponenten emin stellen ±0 (es gilt−0.0 = +0.0 aber 1/(+0.0) = +∞, 1/(−0.0) = −∞) bzw.denormalisierte Zahlen dar (diese haben weniger gultigeStellen).
21 / 34
Uberlauf
Bei Gleitkommazahlen kann ebenfalls Uberlauf auftreten, wenndie betragsgroßte darstellbare Zahl uberschritten wird.
Bei Uberlauf wird kein unsinniges negatives Ergebniseingesetzt (wie bei ganzen Zahlen) sondern der spezielle Wert+∞ bzw. −∞. Damit kann in der Regel normal weitergerechnet werden.
In manchen Fallen kann auch dies zu stark verfalschtenErgebnissen fuhren. Beispiel• x = 1e308 ist eine sehr große aber noch darstellbare Zahl• y = x + x fuhrt zu Uberlauf, Ergebnis +∞• z = y − x liefert +∞, obwohl das Ergebnis 1e308
darstellbar ware
22 / 34
Weitere Ausnahme-Situationen
Weitere mogliche Ausnahme-Situationen und ihre ublicheBehandlung:• Unterlauf (Exponent zu klein), es wird mit 0 weiter
gerechnet• Division durch 0: es wird mit Unendlich weiter gerechnet• Illegale Operation (0/0, ∞−∞, usw.): es wird NaN (not a
number) als Ersatzergebnis eingesetzt• Ungenaues Ergebnis: dies ist fast immer der Fall und wird
ignoriert
Java verwendet diese Standard-Behandlung. ImIEEE-Standard 754 sind auch andere Behandlungs-Variantenvorgesehen.
23 / 34
Gliederung
1 Uberblick
2 Darstellung ganzer Zahlen, Stellenwertsystem
3 Uberlauf
4 Darstellung von Gleitkommazahlen
5 Rundungsfehler
24 / 34
Maschinengenauigkeit
Zwei aufeinanderfolgende Gleitkommazahlen sind
x = 1.000 . . . 00
x = 1.000 . . . 01
Die Differenz beschreibt die relative Genauigkeit desZahlsystems: ”Maschinengenauigkeit“ oder
”Maschinen-Epsilon“ ε = 2−n bei n Nachkommastellen.
Typ ε dezimal etwafloat 2−23 1.2 · 10−7
double 2−52 2.2 · 10−16
Dies entspricht etwa 7 Dezimalstellen bei float und knapp 16Dezimalstellen bei double.Gelegentlich wird auch die Halfte dieses Werts alsMaschinengenauigkeit verwendet (also 2−24 bei float und2−53 bei double).
25 / 34
Rundung
Ergebnisse von Eingabe, Operationen, Ausgabe sind in derRegel nicht mit der vorhandenen Maschinengenauigkeitdarstellbar.
Beispiele:• Summe 1 + 1e20 in double; benotigt etwa 63 Bit zur
exakten Darstellung, double hat aber nur 53 Bit• Produkt zweier beliebiger Zahlen vom Typ double, ergibt
einen Wert mit 2 · 53 = 106 Bit Mantisse; es sind aber nur53 Bit in double fur das Ergebnis vorhanden
26 / 34
Rundung
Das exakte Ergebnis wird durch eine ”Rundung“ auf eine derbeiden benachbarten Maschinenzahlen abgebildet.
Rundungen nach IEEE-Standard 754:• Rundung nach unten (in Richtung −∞)• Rundung nach oben (in Richtung +∞)• Rundung durch Abschneiden (in Richtung 0)• Rundung zur nachstgelegenen Gleitkommazahl
Liegt das Ergebnis einer Operation genau in der Mitte zwischenzwei Gleitkommazahlen, dann wird bei der Rundung zurnachstgelegenen Gleitkommazahl auf das Ergebnis mitgerader Endziffer gerundet.
Java verwendet fur float und double immer die Rundung zurnachstgelegenen Gleitkommazahl.
27 / 34
Rundungsfehler, Abschatzung
Bezeichnet fl(x ◦ y) die Gleitkomma-Auswertung einerOperation x ◦ y , dann gilt fur den relativen Fehler
|fl(x ◦ y)− (x ◦ y)||x ◦ y |
< ε
bzw. bei Rundung zur nachstgelegenen Gleitkommazahl
|fl(x ◦ y)− (x ◦ y)||x ◦ y |
< ε/2
Also umgeformt
fl(x ◦ y) = (x ◦ y) · (1 + e) mit |e| < ε
bzw. bei Rundung zur nachstgelegenen Gleitkommazahl
fl(x ◦ y) = (x ◦ y) · (1 + e) mit |e| < ε/2
28 / 34
Rundungsfehler, Abschatzung bei mehrerenOperationen
Die Rundungsfehler-Abschatzungen gelten nur fur eineeinzelne Operation!
WarnungEs ist sehr schwierig, den Rundungsfehler nach mehrerenOperationen abzuschatzen!
Rundungsfehler nach k Operationen• bei Rundung zur nachstgelegenen Gleitkommazahl
konnen sich Rundungsfehler z.T. gegeneinanderaufheben, der relative Fehler ist dann < k · ε
• in ungunstigen Fallen konnen Rundungsfehler sehr starkanwachsen, der relative Fehler ist dann >> k · ε
• insbesondere bei Subtraktion von etwa gleich großenWerten: Genauigkeitsverlust durch ”Ausloschung“ gultigerZiffern
29 / 34
Rundungsfehler, Ausloschung
Beispiel (3-stellige Dezimalzahlen):
1.23 als Naherung fur 1.23456, 3 Stellen genau1.22 als Naherung fur 1.21613, 3 Stellen genau0.01 Differenz dieser Werte, max. 1 Stelle genau1e − 2 im Gleitkommaformat
Die exakte Differenz ware 0.01843, also 1.84e − 2 imGleitkommaformat. Durch katastrophale Ausloschung ist dasErgebnis extrem ungenau (relativer Fehler etwa 80 Prozentstatt erwarteten 1 Prozent).
Beispiel (double):
fl(1 + 1020 − 1020) = 1020 − 1020 = 0
30 / 34
Gultigkeit mathematischer Eigenschaften
Bei Gleitkomma-Rechnung versagen viele mathematischeRegeln wie Assoziativitat, Distributivitat, usw. Es gilt z.B.
1 = fl(1 + (1020 − 1020)) 6= fl((1 + 1020)− 1020) = 0
Bei Gleitkomma-Rechnung gelten Konvergenzaussagen (Folgeoder Reihe konvergiert gegen Grenzwert) nicht mehr.• numerisch berechnete Folge kann ab einem Index k
konstant bleiben• oder sogar divergieren durch Einfluss von
Rundungsfehlern
31 / 34
Rundungsfehler, Beispiel
Berechne die einfache Formel
p2 − 2 · q2
fur p = 665857.0 und q = 470832.0Das berechnete Ergebnis mit float ist 0.0Das exakte Ergebnis ist 1.0. In diesem Fall liefert double dasexakte Ergebnis.
Quadriert man die Formel, so erhalt man nach der binomischenFormel
p4 − 4 · p2 · q2 + 4 · q4
Mit den gleichen Werten von p und q ist das exakte Ergebnisoffenbar 1, das berechnete Ergebnis mit double ist−3.3554432E7, also falsches Vorzeichen und 7Zehnerpotenzen zu groß (Fehler uber 3 000 000 000 Prozent)!Nach nur 13 arithmetischen Operationen!
32 / 34
Rundungsfehler, Beispiel Patriot-Rakete
Rechenfehler in einer Patriot-Rakete der US-Armee, die zurAbwehr von Scud-Raketen dient• Zeit wird in der Rakete als float Wert mit 32 Bit
Genauigkeit abgespeichert• Uhr zahlt mit Zehntelsekunden• Rechenfehler akkumulieren sich uber mehrere Stunden• zum Einsatzzeitpunkt war die Zeitabweichung 0.34
Sekunden• die angreifende irakische Scud-Rakete fliegt mit 6000 km/h• 0.34 Sekunden entspricht etwa 500 m Weg• daher wurde die Abfangrakete nicht gestartet• Resultat: 28 Tote, 100 Verletzte
Weitere Beispiele fur Rechenfehler mit katastrophalenAuswirkungen siehe http://www.dradio.de/aktuell/791580/
33 / 34
Genauigkeit vs. Sicherheit
Genauigkeit = Abweichung des berechneten Wertes vomexakten WertSicherheit / Verifikation des Ergebnisses = strikter Beweis, dassErgebnis existiert und maximal um x Prozent vom berechnetenabweicht
Dies sind unabhangige Paradigmen, sei z.B. das exakteErgebnis 1• das berechnete Ergebnis 1.00000000000001 ist extrem
genau, aber eventuell unsicher / nicht verifiziert, wennkeine Fehlerabschatzung bekannt ist
• das berechnete Ergebnis 2 ist sehr ungenau, abereventuell ist es sicher / verifiziert, falls eine rigoroseFehlerabschatzung existiert
34 / 34