SQR (ROM-Routine)

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die numerische SQR-Routine zur Berechnung der Quadratwurzel im BASIC-ROM.

Name: SQR
Beschreibung: Quadratwurzel von Fließkommaregister FAC berechnen
Einsprungpunkt: $BF71 / 49009
Übergebene Argumente:
Sonstige: FAC
Rückgabe-Werte:
Sonstige: FAC


Die ROM-Routine SQR[1][2] — manchmal auch als SQRFAC[3] bezeichnet — berechnet die Quadratwurzel der im Fließkommaregister FAC gespeicherten Zahl. Ihr Einsprungpunkt ist in der Tabelle der BASIC-Funktionen an Adresse $A05E hinterlegt, so dass die Routine bei jeder Auswertung der Funktion SQR vom BASIC-Interpreter aufgerufen wird.

Nach dem Aufruf steht in FAC die errechnete Wurzel, während der Inhalt von ARG undefiniert ist. Falls versucht wird, die Quadratwurzel einer negative Zahl zu berechnen, so meldet SQR einen ?ILLEGAL QUANTITY ERROR.

Neben dem Inhalt der Fließkommaregister FAC und ARG ändert SQR auch den Hilfszeiger an Adresse 34/$22 (Low-Byte) und 35/$23 (High-Byte) und die Hilfsregister an den Adressen 38/$26 bis 41/$29 und 78/$4E bis 82/$52 sowie die Fließkommaregister FAC#3 und FAC#4 an den Adressen 87/$57 bis 96/$60.

Algorithmus

SQR implementiert keine eigenständige Berechnung der Quadratwurzel, sondern überträgt nur die in FAC übergebene Zahl nach ARG, lädt dann die Konstante 0.5 nach FAC und geht schließlich in die ROM-Routine FPWRT über. Die Berechnung der Quadratwurzel basiert also auf der Definition sqr(x) = x½.

Laufzeitverhalten

Die Laufzeit von SQR ist hauptsächlich durch die zugrundeliegende ROM-Routine FPWR bestimmt; hinzu kommt die Rechenzeit für das Umkopieren von FAC nach ARG (ROM-Routine MOVFA) und der Konstanten 0.5 nach FAC (ROM-Routine MOVFM). Im Rahmen umfangreicher Messungen ergaben sich für SQR Laufzeiten zwischen 44635 und 50441 Systemtakten, vergleichbar mit dem Rechenzeitbedarf von FPWR im Fall beliebiger Exponenten.

Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs). Im ungünstigsten Fall benötigt die SQR-Routine also etwas mehr als 50 Millisekunden (ms).

Weblinks

Quellen