|
Zurück zur Homepage |
Da die Routine unter Delphi getestet und angewandt werden soll, wird der Parameter vom CPU Stack in den FPU Stack übernommen.
Zu Beginn wird der Betrag des Parameters entsprechend der Spezifikation durch 2π geteilt woraufhin dann bei dem Ergebnis in der Unterroutine TRUNC alle Nachkommastellen entfernt werden. Beim anschließenden Rücksprung in die Hauptroutine wird dieses ganzzahlige Ergebnis der Division des gegebenen Parameters durch 2π wieder mit 2π multipliziert. Nachdem dieser Wert dann von dem ursprünglichen Argument subtrahiert wurde, liegt ein entsprechender Parameter zwischen 0 und 2π vor. Davon wird dann π abgezogen?
In der Schleife L1
wird dann lediglich das Hornerschema abgearbeitet. Hier zeigt sich auch der große Vorteil dieser
Vorgehensweise gegenüber einer Berechnung über die Reihe für den Cosinus, wie sie ursprünglich gegeben ist. Mit Hilfe des
Hornerschemas ist es möglich, die gesamte Berechnung auf nur einem Register durchzuführen, ohne daß eine Zwischenspeicherung von
Zwischenergebnissen nötig wäre.
Die Anzahl der Iterationen beträgt 16. Durch Versuche mit einer verschiedenen Anzahl von Iterationen hat sich herausgestellt, daß so eine ausreichende Genauigkeit erzielt, und trotzdem nicht unnötig lange gerechnet wird. Abschließend wird das Ergebnis invertiert und zurückgegeben.
|
Zurück zur Homepage |
Das Prinzip der Unterroutine TRUNC
ist folgendes: um aus dem Ergebnis der Division des Argumentes durch 2π den ganzzahligen Teil
zu extrahieren, überschreibt man alle Nachkommastellen der Mantisse mit 0-Bits. (Darstellung von Gleitkommazahlen nach dem IEEE-754 Standard)
Hierzu wird zunächst aus dem Exponententeil der vorliegenden Fließkommazahl, der ja lediglich relativ vorliegt durch Subtraktion von 16383 der reale Exponent berechnet.
An dieser Stelle werden zwei Spezialfälle abgeprüft:
MAKE_ZERO
wird dann 0 in den TOS (Top Of Stack=aktuell oberstes Register der FPU) geladen und es erfolgt der
Rücksprung in die Hauptroutine.MAKE_NOTHING
, wo
die unveränderte Zahl wieder vom Stack, wo sie zu Bearbeiten zwischengespeichert war, in den FPU-Stack geladen wird. Dann erfolgt der
Rücksprung nach AMCOS
.Normalerweise liegt das Komma innerhalb der Mantisse. In diesem Fall wird durch Subtraktion des Exponenten von 63 die Anzahl der zu schreibenden
Nullbits ermittelt. Dies geschieht in der Unterroutine ROUND_LOOP
, die die Mantisse byteweise von hinten nach vorne wandernd mit
Nullbytes überschreibt, bis die Anzahl der Nullbits kleiner als 8 ist. Dann erfolgt ein Sprung in eine weitere Unterroutine (
FINISH_ZEROS
), wo im Register CL ein Byte erzeugt wird, das vorne nur aus 1-Bits und hinten aus genau so vielen 0-Bits besteht, wie noch zu
löschen sind. Im letzten Schritt erfolgt eine logische UND-Verknüpfung dieses Bytes mit dem Byte der Mantisse, in der sich das Komma
befindet. Dadurch werden alle Vorkommastellen erhalten und alle Nachkommastellen auf 0 gesetzt. Dann wird die erzeugte ganze Zahl auf den FPU-Stack
geladen und das Programm springt zurück in die Hauptroutine.
|
Zurück zur Homepage |