Einführung in die Systemprogrammierung Repräsentierung Rationaler Zahlen Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 19. Juni 2015
Rationale Zahlen Wie können wir Rationale Zahlen im Rechner repräsentieren? Festkommazahlen Brüche Fließkommazahlen
Festkommazahlen Idee: wir speichern die Zahl als Zweierkomplementzahl mit multiplikativem Bias Beispiel: Zwei Dezimal-Nachkommastellen: repr(n) = n 100 n repr(n) 0 0 1 100 4,99 499 Addition/Subtraktion: Wie bei Zweierkomplement Multiplikation: repr(repr(x) repr(y)) = x y 100
Division von Festkommazahlen Vorsicht bei der Division! ( ) repr(x) repr = x repr(y) y 100 0,4 : 0,3 Erst Division: 100 * (40 / 30) = 100 * 1 = 100 = repr(1) Erst Multiplikation: (100 * 40) / 30 = 4000 / 30 = 133 = repr(1,33) Integer-Division schneidet Nachkommastellen ab! Schneller: Bit-Schiebeoperationen statt langsamer Division, aber nur für Binärnachkommastellen
Festkommazahlen: Eigenschaften Vorteile: Festkommazahlen sind exakt bei Addition, Subtraktion (modulo Überlauf) Festkommazahlen sind effizient bei Addition, Subtraktion Mit existierenden Mitteln einfach zu implementieren Nachteile: Festkommazahlen sind ungenau bei Multiplikation, Division Festkommazahlen arbeiten immer mit festem Multiplikator (100, in unserem Beispiel) Fester Multiplikator ist für naturwissenschaftliche Zwecke nicht flexibel genug!
Fließkommazahlen: Die Idee Naturwissenschaftler: Wir brauchen Zahlen mit sehr unterschiedlichen Größenordnungen! flexibler multiplikativer Bias! Repräsentierungsbeispiel: 4,2 10 23 als 420, 23 1,15 10 8 als 115, 8 Wir speichern den Exponenten der Zahl zusammen mit einer Annäherung der signifikanten Ziffern (Mantisse) Im Rechner sind Zweierexponenten effizienter als Zehnerexponenten
Fließkommarepräsentierung...... Vorzeichen Exponent Mantisse Zahl getrennt in Vorzeichenbit, Exponent, Mantisse Exponent mit Bias gespeichert Falls die Zahl 0, muß Binärmantisse immer mit 1 beginnen, daher ist dieses Bit implizit. Beispiel: 8 Bits Exponent, Bias 127, Mantisse 23 Bits
Fließkommarepräsentierung: Beispiel 0 1000 1000 1111 0100 0000 0000 0000 000 Vorzeichen Exponent Mantisse Beispiel: 8 Bits Exponent, Bias=127, Mantisse 23 Bits Vorzeichen v = 0 Exponent e = 10001000 2 127 = 9 Mantisse m = 1,11110100000000000000000 2 = 1.953125 10 1 v 2 e m = 1 512 1.953125 = 1000
IEEE 754: Fließkommazahlen Standardisierte Repräsentierung: IEEE-754 Format Exponent Bias (Exponent) Mantisse binary32 8 Bits 127 23 Bits binary64 11 Bits 1023 52 Bits Unterstützt von handelsüblicher Hardware, z.b. dem MIPS-Coprozessor #1 binary32 auch als Fließkommazahl mit einfacher Präzision bezeichnet (C/C++/Java: float) binary64 auch als Fließkommazahl mit doppelter Präzision bezeichnet (C/C++/Java: double)
IEEE 754: Besondere Zahlen Bestimmte Bitmuster haben spezielle Bedeutungen. Hier für binary32: IEEE 754-Zahlen nehmen besondere Bedeutungen an, wenn der Exponent nur aus 0- oder 1-Bits besteht. Exponent = 0...0: 0x00000000 repräsentiert 0 0x80000000 repräsentiert 0 Allgemein: 1 v 2 126 m (ohne 1,-Erweiterung) Exponent = 1...1: 0x7f800000 repräsentiert 0xff800000 repräsentiert Andere Werte für NaN, not a number: Bei 0 0 Bei 1...
Fließkomma-Multiplikation...... xor + 1............ + Verschiebung (δ) Normalisierung Hier nur für normale Fließkommazahlen beschrieben Vorzeichen, Exponent: multiplizieren Mantisse: ( 1 ): mit fühender 1, erweitern, multiplizieren Normalisieren: um δ verschieben, bis genau eine 1, vor dem Komma δ auf Exponent addieren Auf Überlauf prüfen
Fließkomma-Addition 0 e 0 m 0 + 0 e 1 m 1 Annahme: positiv, e 0 > e 1. Andere Fälle analog. m 0 + 0...01 m 1 e 0 e 1 0 e 0 m c Exponent ist der größere (e 0 ) Hintere Bits von m 1 werden abgeschnitten, Resultat der Mantissenaddition nach m c Überlauf um 1 Bit möglich
Risiken bei Fließkommazahlenarithmetik Zahlenrepräsentierung notwendigerweise ungenau Addition/Subtraktion von Zahlen verschiedener Größenordnung verwirft Nachkommastellen Wenn Differenz zwischen Exponenten größer ist als Mantisse, ist Addition/Subtraktion komplett wirkungslos! Vorsicht beim Aggregieren von Zahlen!
Fließkommaregister auf MIPS binary32: $f0 $f1... $f30 $f31 binary64: $f0... $f30 MIPS: Fließkommazahlen in Coprozessor #1 32 binary32-fließkommaregister $f0 bis $f31 Je zwei konsekutive Register $fx,$fx+1 können als binary64-register zusammengeschaltet werden Erstes Register muß geradezahlig sein $f0, $f2,... binary64-register hat gleichen Namen wie erstes Register
Fließkommaarithmetik auf MIPS Befehl Bedeutung Register add.s $z, $x, $y binary32 $z := $x + $y add.d $z, $x, $y binary64 sub.s $z, $x, $y binary32 $z := $x $y sub.d $z, $x, $y binary64 mul.s $z, $x, $y binary32 $z := $x $y mul.d $z, $x, $y binary64 div.s $z, $x, $y $z := $x binary32 div.d $z, $x, $y $y binary64 sqrt.s $z, $x $z := binary32 $x sqrt.d $z, $x binary64 Alle Grundrechenoperationen und die Quadratwurzel als binary32 (.s) oder binary64 (.d)
MIPS-Fließkommas: Kopieren, Konvertieren Konvertierungen: cvt.s.d $z, $x: Konvertiere binary64 nach binary32 cvt.s.w $z, $x: Konvertiere Zweierkomplementzahl nach binary32 cvt.d.w,s: Konvertiere nach binary64 cvt.w.s,d: Konvertiere nach Zweierkomplement Kopieren zwischen Hauptprozessor und Koprozessor #1: mtc1 $z, $x: CPU Koprozessor z.b.: mtc1 $f0, $v0 mfc1 $z, $x: Koprozessor CPU z.b.: mfc1 $v0, $f0 Weitere Operationen: Vergleich, Runden,...
Zusammenfassung: Fließkommazahlen v e m Vorzeichen Exponent Mantisse Fließkommazahl besteht aus Vorzeichen v, Exponent e, Mantisse m Wert: meist 1 v 2 e 1,m Sonderwerte wenn alle Bits im Exponenten 0 oder 1 sind Ermöglichen effizientes Arbeiten mit Zahlen in unterschiedlichen Größenordnungen Vorsicht: Addition/Subtraktion impräzise bei ungleichen Exponenten
Zusammenfassung: Rationale Zahlen Repräsentierung per Fixkommazahlen: Fester multiplikativer Bias Einfach zu implementieren (keine Zusatzhardware nötig) Verwendet Standardregister Repräsentierung per Bruchzahlen (per Softwarebibliothek) Repräsentierung per Fließkommazahlen Multiplikativer Bias je nach Zahl unterschiedlich Benötigt Zusatzhardware, aber auf fast allen modernen Prozessoren verfügbar Verwendet meist Zusatzregister