HaDePrak WS 05/06 10. Versuch 1

Das IEEE-Format

¨ Das Ziel dieser letzten Ubung ist es, ein Fließkommapaket f¨ ur die DLXzu implementieren. Der Einfachheit halber vernachl¨assigen wir hier im Praktikum jeglichen Luxus (wie z. B. die trigonometrischen Funktionen, den Logarithmus und dergleichen), und begn¨ ugen uns mit Addition/Subtraktion und Multiplikation/Division. Die Darstellung von Fließkommazahlen ist durch das IEEE-Format (IEEE steht f¨ ur Institute of Electrical and Electronical Engineers) international standardisiert, wobei zwei veschiedene L¨angen von Fließkommazahlen (bzw. ihrer Darstellung) unterst¨ utzt werden: einfache Genauigkeit (float, 32 Bits) und doppelte Genauigkeit (double, 64 Bits). Hier im Praktikum werden wir uns aber nur mit der 32-Bit-Darstellung besch¨aftigen.

1.1

Zahlendarstellung

Fließkommazahlen werden oft in wissenschaftlicher Notation als M antisse ∗ BasisExponent (z. B. 52.8 ∗ 108 ) dargestellt. Auf einem Taschenrechner w¨ urde aus diesem Beispiel 5.28E9. Der Taschenrechner ver¨andert also die eingegebene Zahl (er normalisiert sie), d. h. die Zahl vor dem Komma ist gr¨oßer als 0 und kleiner als 10 (allgemein: kleiner als die Basis). Fließkommazahlen werden im IEEE-Format generell normalisiert abgespeichert. Da die RESA/DLX im Bin¨arsystem rechnet, ist die Zahl (bzw. Ziffer) vor dem Dezimalpunkt immer eine ’1’. Diese ’1’ wird im IEEE-Format nicht mit abgespeichert um Speicherplatz zu sparen. Der Exponent besitzt in diesem Format kein Vorzeichen, stattdessen wird zum tats¨achlichen Exponenten ein Offset hinzu addiert, um immer eine positive Zahl zu erhalten. Dieser Offset wird auch als Bias bezeichnet und ist in der Gr¨oße direkt von der Anzahl der Bits abh¨angig, die zur Speicherung des Exponenten zur Verf¨ ugung stehen. Der kleinste Exponent in einer IEEE-Zahl ist also 0 und entspricht bei einem 8-Bit-Exponenten z. B. −127. Die Aufteilung der einzelnen Bits ergibt sich aus folgenden Tabellen bzw. Skizzen: • einfache Genauigkeit (32 Bit) – Bit 31: Vorzeichen der Mantisse (s) – Bit 30 . . . 23: Exponent (e7 . . . e0 ) uhrende 1 (m1 . . . m23 ) – Bit 22 . . . 0: Mantisse ohne f¨ • doppelte Genauigkeit (64 Bit) – Bit 63: Vorzeichen der Mantisse (s) – Bit 62 . . . 52: Exponent (e10 . . . e0 ) – Bit 51 . . . 0: Mantisse ohne f¨ uhrende 1 (m1 . . . m52 )

V10 1.2

Denormalisierte Zahlen

2

Einfache Genauigkeit Vorzeichen

Exponent (8 Bit) 31 30

Mantisse (23 Bit)

23 22

0

Doppelte Genauigkeit Vorzeichen

Exponent (11 Bit) 63 62

Mantisse (52 Bit)

52 51

0

Der Wert einer solchen Zahl ist also (−1)s ∗ 1.m ∗ 2e−BIAS . Hierzu zwei Beispiele (f¨ ur 32 Bit): • 0.7510 = 0.112 = 1.12 ∗ 2−1 = 00111111010000000000000000000000IEEE • −25510 = −111111112 = −1.11111112 ∗ 27 = 11000011011111110000000000000000IEEE Bei obiger Darstellung wird zur Darstellung der Null ein Exponent von 0 benutzt.

1.2

Denormalisierte Zahlen

Das oben vorgestellte IEEE-Format besitzt zwei Sch¨onheitsfehler: 1. Zwischen der Null und der ersten darstellbaren Zahl existiert eine unverh¨altnism¨aßig große L¨ ucke, d. h. der Abstand von der Null zur ersten darstellbaren Zahl ist wesentlich gr¨oßer als der Abstand zwischen zwei (darstellbaren) kleinen Zahlen. ur Sonderf¨alle w¨are dies 2. Undefinierte Zahlen und ±∞ k¨onnen nicht dargestellt werden. Gerade f¨ aber w¨ unschenswert. Das erste Problem l¨ost man mit Hilfe von denormalisierten Zahlen: Bei einem Exponenten von Null und einer Mantisse ungleich Null soll folgende Zahl (bei 32 Bit) dargestellt werden: (−1)s ∗ 0.m ∗ 2−126 Hierdurch wird sowohl die Darstellung von sehr kleinen Zahlen erm¨oglicht als auch die Zahl der redundanten Darstellungen der Null reduziert (jetzt gibt es nur noch zwei Darstellungen: +0 und −0). Eine m¨ogliche Darstellung von ±∞ und undefinierten Zahlen erreicht man durch Reservierung des Exponenten 255 f¨ ur diese F¨alle. Einzelheiten sind aus den nachfolgenden Tabellen ersichtlich.

1.3

Rechnen mit dieser Darstellung

Solange man sich im Darstellungsbereich des Zahlenformats befindet (normalisierte bzw. denormalisierte Zahlen), sollte eine Rechnung auch das (innerhalb der Maschinengenauigkeit) korrekte Ergebnis liefern (inklusive Rundung). In allen anderen F¨allen halte man sich an Tabelle 2.

1.4

Runden

IEEE unterst¨ utzt folgende drei Rundungsarten: zur n¨achsten Zahl auf– bzw. abrunden, immer aufrunden und immer abrunden. Bei der ersten Rundungsart muß mindestens ein Bit des ZwischenErgebnisses mehr berechnet werden, als f¨ ur die Darstellung ben¨otigt wird.

V10

2

3

Hausaufgaben (20 Punkte)

Schreibe DLX-Routinen, die zwei Fließkommazahlen des oben vorgestellten Formats addieren, subtrahieren, multiplizieren bzw. dividieren k¨onnen. Fange hierbei alle oben aufgef¨ uhrten Sonderf¨alle ab. Es soll normal gerundet werden, d. h. zur n¨achsten Zahl. Gehe bei der Programmierung von folgenden Registerbelegung aus: Register R1=A R2=B R3=ERG1 R4=ERR R5=FORM

Bedeutung erster Operand zweiter Operand Ergebnis Fehlermeldung Format der Daten (1 = Float, 0 = Int)

Hier noch einige Tips: • Schreibe eine Normalisierungsroutine, die Du dann immer benutzen kannst. • Links– bzw. Rechtsschieben ist notwendig, aber u ¨berall dort, wo es m¨oglich ist, zu vermeiden. • Zwei IEEE-Zahlen k¨onnen verglichen werden, indem man das Vorzeichen vergleicht und danach den Rest (Exponent und Mantisse) der beiden Zahlen voneinander subtrahiert (wie bei Integern). Hierdurch erh¨alt man die betragsm¨aßig gr¨oßere Zahl. • Zur Addition bzw. Subtraktion ermittelt man die betragsm¨aßig gr¨oßere Zahl, verschiebt die ¨ andere entsprechend und f¨ uhrt dann die Operation aus. Achte auf Ubertrag und die zum Runden ben¨otigten Bits. • Bei Multiplikationen m¨ ussen alle 48 Bit des Ergebnisses berechnet werden, da man bei denormalisierten Zahlen eventuell auch die hinteren Bits ben¨otigt.

V10

4

Tabelle 1: Gleitkomma-Format bei einfacher und doppelter Genauigkeit Speicherformate Einfache Genauigkeit: s eeee eeee fff ffff ffff ffff ffff ffff Doppelte Genauigkeit: s eee eeee eeee ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff/ Beschreibung einfache Genauigkeit doppelte Genauigkeit Feldgr¨ oßen in Bit s = Vorzeichen 1 (Bit 31) 1 (Bit 63) e = Exponent mit Bias 8 (Bit 30 . . . 23) 11 (Bit 62 . . . 52) f = Mantissen-Nachkommastellen 23 (Bit 22 . . . 0) 52 (Bit 51 . . . 0) Gesamt 32 64 Vorzeichen Positive Mantisse, s = 0 0 Negative Mantisse, s = 1 1 Normalisierte Zahlen BIAS von e +127 ($7F) +1023 ($3FF) Wertebereich von e 0 < e < 255($F F ) 0 < e < 2047($7F F ) Wertebereich von f 0 oder 6= 0 0 oder 6= 0 Mantisse Komplett 1.f 1.f Zahlen-Repr¨ asentation (−1)s × 2e−127 × 1.f (−1)s × 2e−1023 × 1.f Denormalisierte Zahlen e = Format-Minimum 0 0 BIAS von e +126 ($7E) +1022 ($3FE) Wertebereich von f 6= 0 6= 0 Mantisse 0.f 0.f Zahlen-Repr¨ asentation (−1)s × 2−126 × 0.f (−1)s × 2−1022 × 0.f Nullen (vorzeichenbehaftet) e = Format-Minimum = 0 0 f = Mantissen-Nachkommastellen 0.f = 0.0 0.f = 0.0 Unendlich (vorzeichenbehaftet) e = Format-Maximum = 255 ($FF) 2047 ($7FF) f = Mantissen-Nachkommastellen 0.f = 0.0 0.f = 0.0 NaN (Not-a-Number) s= nicht signifikant nicht signifikant e = Format-Maximum = 255 ($FF) 2047 ($7FF) f= 6= 0, und zwar 6= 0, und zwar .1xxx. . . xxx .1xxx. . . xxx Non-Signalling Non-Signalling .0xxx. . . xxx .0xxx. . . xxx Signalling Signalling mit xxx. . . xxx 6= 0 mit xxx. . . xxx 6= 0 Wertebereiche (gerundet) gr”o”ste positive norm. Zahl 3.4 × 1038 1.8 × 10308 kleinste positive norm. Zahl 1.2 × 10−38 2.2 × 10−308 kleinste positive denorm. Zahl 1.4 × 10−45 4.9 × 10−324

V10

3

5

¨ Praktische Ubung

Erweitere Dein Programm ¨ahnlich zu Versuch 10, sodaß es auf ganzen Datenpaketen arbeitet. Bringe Dein Programm zum Laufen und teste seine Korrektheit. Schreibe zwei Routinen, die die Umwandlung von Integer nach Float und umgekehrt vornehmen. Teste damit zum einen Dein Programm mit reinen Intergerwerten (die dann von den Routinen zu Float-Zahlen umgewandelt werden; das Ergebnis soll ¨ dann zur besseren Uberpr¨ ufbarkeit wieder in einen Integerwert umgewandelt werden). Erstelle dar¨ uberhinaus einige wenige Float-Zahlen direkt von Hand zum Test der Sonderf¨alle. Die Ergebnisse sollen dann sowohl als IEEE– als auch als Integer-Zahlen (falls m¨oglich) ausgegeben werden.

Tabelle 2: Verkn¨ upfungstafeln f¨ ur die einzelnen Operationen Operand: +Zahl −Zahl +0 −0 +∞ −∞

+Zahl Summe Summe Summe Summe +∞ −∞

1. Addition −Zahl +0 Summe Summe Summe Summe Summe +0 Summe −0 +∞ +∞ −∞ −∞

−0 Summe Summe +0 −0 +∞ −∞

+∞ +∞ +∞ +∞ +∞ +∞ NaN

−∞ −∞ −∞ −∞ −∞ NaN −∞

Operand: +Zahl −Zahl +0 −0 +∞ −∞

+Zahl Differenz Differenz Differenz Differenz +∞ −∞

2. Subtraktion −Zahl +0 Differenz Differenz Differenz Differenz Differenz +0 Differenz −0 +∞ +∞ −∞ −∞

−0 Differenz Differenz −0 +0 +∞ −∞

+∞ −∞ −∞ −∞ −∞ NaN −∞

−∞ +∞ +∞ +∞ +∞ −∞ NaN

Operand: +Zahl −Zahl +0 −0 +∞ −∞

+Zahl Produkt Produkt +0 −0 +∞ −∞

3. Multiplikation −Zahl +0 Produkt +0 Produkt −0 −0 +0 +0 −0 −∞ NaN +∞ NaN

−0 −0 +0 −0 +0 NaN NaN

+∞ +∞ −∞ NaN NaN +∞ −∞

−∞ −∞ +∞ NaN NaN −∞ +∞

Operand: +Zahl −Zahl +0 −0 +∞ −∞

+Zahl Quotient Quotient +0 −0 +∞ −∞

4. Division −Zahl +0 Quotient +∞ Quotient −∞ −0 NaN +0 NaN −∞ +∞ +∞ −∞

−0 −∞ +∞ NaN NaN −∞ +∞

+∞ +0 −0 +0 −0 NaN NaN

−∞ −0 +0 −0 +0 NaN NaN

Horizontal ist immer der zweite, vertikal der erste Operand aufgef”uhrt.