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:

[80-Bit FP-Zahl]

Bit-NrBeschreibung
79Vorzeichen-Bit. 0 = positive, 1 = negative Zahl
78...64Exponent. 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...0Mantisse. 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:

  1. shift = exponentA - exponentB
  2. Wenn shift positiv ist: mantissaB = mantissaB >> shift; exponentC = exponentA
    Wenn shift negativ ist: mantissaA = mantissaA >> -shift; exponentC = exponentB
    (Bei der Bitverschiebung wird links mit Nullen aufgefüllt.)
  3. Wenn die Vorzeichen von A und B gleich sind:
    mantissaC = mantissaA + mantissaB; signC = signA
  4. Wenn die Vorzeichen von A und B verschieden sind:
    mantissaC = mantissaA - mantissaB; signC = signA

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