Spezifikation des Programms |
Verwendetes Zahlenformat |
Die Aufgabenstellung verlangt die Bearbeitung von Zahlen im extended precision format des IEEE-floating point-Standards. Eine Zahl besteht in dieser Darstellung aus 80 Bits:
| Bit-Nr | Beschreibung |
|---|---|
| 79 | Vorzeichen-Bit. 0 = positive, 1 = negative Zahl |
| 78...64 | Exponent. Die Mantisse wird mit 2Exponent-16383 multipliziert, ein Wert von 16380 ist also z.B. gleichbedeutend mit einer Division durch 8. Der Exponent muß im Bereich 0...32766 liegen - der Wert 32767 wird für Sonderfälle verwendet (siehe unten). |
| 63...0 | Mantisse. Der (imaginäre) Dezimalpunkt der durch sie dargestellten Zahl liegt zwischen dem 63. und 62. Bit, d.h. Bit 63 hat die Wertigkeit 1, Bit 62 die Wertigkeit ½, Bit 61 die Wertigkeit ¼ etc. Die FP-Zahl ist normalisiert, wenn Bit 63 gesetzt ist, die Mantisse also eine Zahl im Bereich [1...2[ darstellt.
Bei der Negation einer Zahl ändert sich nur das Vorzeichen-Bit, nicht die Mantisse. |
Bei der Darstellung der Null wird neben der Mantisse auch der Exponent auf Null gesetzt.
Enthält der Exponent den Wert 32767, wird ein Spezialfall dargestellt. Sind in diesem Fall die Bits 63...0 gelöscht, so handelt es sich in Abhängigkeit vom Vorzeichen-Bit um ± unendlich, ansonsten um eine NaN (Not-A-Number), z.B. als Ergebnis einer Division durch Null.
Vorgehen bei der Addition |
Die Addition zweier Zahlen wird wie nachfolgend beschrieben durchgeführt. signX, exponentX und mantissaX bezeichnen die entsprechenden Bitfelder von Argument A und B sowie dem Ergebnis C:
shift = exponentA - exponentB
shift positiv ist: mantissaB = mantissaB >> shift; exponentC = exponentA
shift negativ ist: mantissaA = mantissaA >> -shift; exponentC = exponentBmantissaC = mantissaA + mantissaB; signC = signA
mantissaC um eine Stelle nach rechts schieben, Bit 63 setzen und exponentC um 1 erhöhen
mantissaC Null ist, exponentC auf Null setzen
exponentC 32767 ist, C auf Null setzen und das Overflow-Flag setzen
mantissaC = mantissaA - mantissaB; signC = signA
mantissaC bilden und wieder mantissaC zuweisen; außerdem signC invertieren
mantissaC Null ist, exponentC auf Null setzen
mantissaC von Null verschieden, die Mantisse so lange um ein Bit nach links verschieben und gleichzeitig exponentC um 1 verringern, bis Bit 63 gesetzt ist
Die Assemblerroutine benutzt die erweiterten Befehle des 80386-Prozessors, da diese einerseits den Umgang mit der 64 Bit langen Mantisse erleichtern, andererseits unterstützt 80386-Assembler Schiebebefehle, die für die Aufgabe sehr nützlich sind.
Da die Routine den Ausnahmen-Mechanismus im Fall eines Overflow nicht vollständig nachzubilden braucht, wird dieser nur durch das Setzen eines zusätzlichen Flag-Words auf -1 angezeigt, das vom aufrufenden Programm überprüft wird.
C-Programm für Test und Leistungsvergleich |
Das C-Programm, das zum Test der Assemblerroutine und zum Geschwindigkeitsvergleich mit dem FPU-Befehl dient, läßt den Benutzer zwei Zahlen eingeben. Innerhalb einer Schleife wird die Addition dann jeweils gleich oft mit dem FPU-Befehl (hierfür wird vom C-Compiler generierter Code verwendet; dieser benutzt automatisch die FPU) und der Assemblerroutine durchgeführt.
Für die Zeitmessung wird auf vordefinierte C-Libraries zurückgegriffen. Das compilierte Programm soll vom DOS-Prompt aus gestartet werden.
| zurück | 01. 04. 1998 - Richard Atterer, Korbinian Herrmann, Florian Müller |