Technische Universität München SoSe 0 Institut für Informatik Prof Dr Thomas Huckle Dipl-Math Jürgen Bräckle Nikola Tchipev, MSc Numerisches Programmieren, Übungen Musterlösung Übungsblatt: Zahlendarstellung, Rundungsfehler ) Umrechnung von Zahlen i) Zahldarstellung in allgemeinem System: N i0 r ibasis i mit r i {0,,, Basis } dezimal binär trinär hexadezimal Basis 3 6 darzust Zahl 9 0 0 3 darzust Zahl 0 f darzust Zahl 5 00 ff ii) Schriftliches Dividieren der Brüche im binären System analog zum dezimalen: : (binär) : - 0 0 0 : 0000 bzw 000 -) 0 0 0 : (binär) : Alternative: 0 0 0 0 : 0 0 00000 bzw 0000 -) 0 0 0 0 -) 0 0 0 0 0 0 i) 8 0, 0 0 ii) 8 6 0, 0 0 0
) Rechnen mit einfachen Gleitkomma-Zahlen dezimal binär 8 00 05 0 Damit gilt: ( 8 + ) + 05 ( 00 + ) + 0 ( ) + 0 35 (kein Runden nötig) 8 + ( + 05) 00 + ( + 0 ) 00 + ( ) Runden! 00 + (0 ) 0 Das Ergebnis ist offensichtlich abhängig von der Reihenfolge der abgearbeiteten Operationen Diese Rundungsfehler können auch zu sehr großen Fehlern führen Dabei sei auf die Aufgabe zur Stabiliätsanalyse auf dem nächsten Blatt verwiesen 3) Gleitkomma-Zahlen i) Schriftliches Dividieren (wie in Aufg ): : (binär) : 0 : 0 0 0000 bzw 000 -) 0 0 0 0 0 0 -) 0 0 0 0 -) 0 0 0 0 0 0 Damit erhält man insgesamt: 000 0 Alternative:
< 0 < 0 8 < 0 8 6 6 < 0 8 < 0 8 6 6 ii) Rundungsregel (korrektes Runden) für eine Zahl x ( ) ν e x x x t x t x t+ x t+ : Nr Fallbed Rundungsvorschrift Einfacher Fall: Abrunden ) x t 0 rd(x) ( ) ν e x x x t Einfacher Fall: Aufrunden x t ) x t x t+ x t+ 00000000 rd(x) ( ) ν e (x x x t + (t ) ) Runden zur näheren geraden Mantissen-Zahl: 3) x t x t x t+ 0 0000000 rd(x) ( ) ν e x x x t ) x t x t x t+ 0000000 rd(x) ( ) ν e (x x x t + (t ) ) Erläuterungen zu den verschiedenen Fällen: Fall ) und ) stellen den normalen Fall dar, dass eine reelle Zahl nicht genau in der Mitte zwischen den beiden nächsten Maschinenzahlen liegt; es wird zum näheren Nachbarn gerundet Fall 3) und ) bewirken ein Runden mit Mantissenende x t 0 für reelle Zahlen, die genau zwischen zwei Maschinenzahlen liegen In Fall ) und ) wird mit + (t ) das letzte Bit um eins erhöht (und eventuell ein Übertrag durchgeführt) Frage: Wie kann eine Floating Point Einheit auf der CPU unendlich viele Stellen zum Runden ausrechnen (z B bei periodischen Nachkommastellen)? Das ist nicht nötig Z B muss bei der Division lediglich bekannt sein, ob ein x t+ un-
,5,5,35,5,65,5,85 Fall :,09 Fall :, Fall 3:,5 Fall :,35 Abbildung : Veranschaulichung von Rundungen auf dem Zahlenstrahl gleich 0 ist Diese Information ist über den Rest erhältlich, der ab dem Berechnen von der Stelle x t+ übrig bleibt Beispiel: Es stehen zwei Mantissenbits zur Verfügung, also:, x x t x t x t+ x t+ Damit sind die folgenden Zahlen exakt darstellbar:, 00, 0, 5,, 5,, 5 Beispiele für alle vier Fälle aus der obigen Tabelle: Nr Binärzahl Dezimalzahl ab-/aufrunden ),00 0, 0935 abrunden ), 00, 85 aufrunden 3), 00 0, 5 abrunden ), 0 0, 35 aufrunden Abbildung veranschaulicht die vier Fälle auf dem Zahlenstrahl Für unsere Zahl 000 0 aus Teilaufgabe i) bedeutet das: Bit-Verwendungszweck gesetztes Bit für 000 0 Vorzeichen ( Bit) ( - wird zu ) Exponent (8 Bits) (0 + ) 0 Mantisse (3 Bits) 0 0 0 0 0 0 0 0 0 0 0 0 Das letzte Bit der Mantisse ergibt sich nach der Rundungsregel (so)
iii) Zwei Beispiele: Die Zahl x + 30 ist nicht exakt darstellbar (zuwenig Stellen) Die Zahl wird als rd(x) abgespeichert (vgl Rundungsregeln) Absoluter Fehler: Relativer Fehler: f abs : x rd(x) 30 f rel : f abs /x < 30 x 000 0 Absoluter Fehler: f abs 0 6 Relativer Fehler: f rel 00 6 f abs iv) Definition: Maschinengenauigkeit Die größte positive Zahl ε Ma, so dass ε Ma Die kleinste darstellbare Zahl größer als ist + 3 (3 Bits echt für Mantissen- Nachkommastellen frei, da Normierung nicht extra gespeichert werden muss!) Folglich liegt ε in einer Größenordnung von
) Ermittlung von π nach Archimedes Effekt wie in Tabelle auf Angabe: Vermeintlich höhere Genauigkeit durch mehr Rekursionen verbessert das Ergebnis nicht sondern zerstört den gesamten Wert! Problem: Auslöschung! Algebraische Umformung zur Vermeidung der Auslöschung: s n+ s n s n + s n + s s n n + s n Vergleich der absoluten Fehler der beiden Formeln in Bezug auf echte Lösung π in semilogarithmischer Skala (erstellt mit matlab-programm archimedesm aus www): Approximation von π 0 schlechte Formel (Ausloeschung!) stabile Formel 5 Absoluter Fehler 5 0 5 5 0 5 Iterationen
Zusatzaufgabe: Fehlerabschätzung von Zeitschrittweiten Floating Point Darstellung von /60: Wir starten mit einfacher Division: 0 0 0 0 0 0 : 0 0 00000000 bzw 000000 -) 0 0 0 0 0 0 0 0 -) 0 0 0 0 Für die Mantisse stehen 3 Bit zur Verfügung Die erste an der 6-ten Nachkommastelle wird allerdings nicht explizit abgespeichert D h erst ab der 30-ten Nachkommastelle können die Ziffern nicht mehr abgespeichert werden: 0,00000 000 000 000 000 000 000[ Nr der Nachkommastelle: 5 9 3 Mit der Normalisierung und dem nicht-abspeichern der führenden kann die Zahl deshalb bis auf die 9 Stelle genau abgespeichert werden Wie wird die Zahl dann als floating-point Zahl abgespeichert? Sign: 0 für positive Zahlen Exponent: -6+ 0b0 Mantisse: 0b000000000000 mit nach oben gerundeter letzten Stelle! 0 00 000000000000 Sign Exponent Mantissa Floating point number: () 6 3 8989 00666666535906963 Kleines Beispielprogramm für Zweifler: #i n c l u d e <iostream> i n t main ( ) { f l o a t l ( 0 / 6 0 0 ) ; std : : cout << l << std : : endl ; std : : cout << ( void ) ( unsigned long )& l << std : : endl ; } / Output : 006666 0 x3c888889 ( 000000000000) /
Wie kann man das Problem umgehen? Positionsänderung relativ zur Startposition berechnen Als Zeitschrittweite eine er-potenz wählen (zb /6) Rechengenauigkeit erhöhen Fehler ignorieren, wenn die Simulationsdauer klein genug ist Zusatzaufgabe zu Aufgabe ) i) Quadrat: s U 56568 s n H n h n s n+ Abbildung : Definition der rekursiven Größen ii) Es gilt mit den Definitionen aus Abbildung (+Satz von Pythagoras!): ( h sn ) n + H n h n ( Hn sn ) + s n+
und damit s n+ ( sn ) ( Hn + ( h n ) sn ) + ( ) ( sn ) ( sn ) + ( ) ( sn ) ( sn ) ( sn + + ( sn ) s n ) Der gesamte Umfang des n -Ecks ergibt sich somit zu U n n s n und damit also π n U n / n s n