Im Magazin „PASCAL", Ausgabe 6'87, wurde der folgende Artikel abgedruckt.
|
|
Spätestens jetzt wird Snobisten klar:
Ein Taschenrechner für 50 Mark kann besser rechnen!
Während ein Taschenrechner noch mühelos 69! = 1,711224 * 1098 berechnet, geben die meisten Programmiersprachen der Computer nur noch die Fehlermeldung »Overflow« aus.
Ganz schlimm wird es, will man das exakte Ergebnis bekommen. Schafft ein Taschenrechner hier nur 11!, so muß der PC schon bei 8! die Flagge streichen. Abhilfe schafft hier »LONGINT.PAS« - eine Unterprogrammbibliothek, die die Operationen +,-,*,=,<, »shl« und »shr« für einen von Ihnen zu bestimmenden, neuen Datentyp »LONGINTEGER« beinhaltet. Maschinenspracheprogrammierer wird die Vorgehensweise nicht unbekannt sein: Die Zahlen werden in einem »Array of Byte« dargestellt, auf welches dann die Dualarithmetik angewandt wird. Für Pascalisten, deren Compiler den Datentyp »Byte« nicht kennt, sei vermerkt, daß es ein »Array of Char« in Verbindung mit den Funktionen »CHR« und »ORD« auch tut. Allerdings leidet darunter etwas die Geschwindigkeit! Die Aufrufe der,für den Typ LONGINTEGER zuständigen Operationen sind etwas gewöhnungsbedürftig. Da ein Pascal-Compiler vom Benutzer nicht ohne weiteres erweitert werden kann, wurden die LONGINTEGER-Operationen als Prozeduren realisiert. Die Tabelle zeigt eine Gegenüberstellung der »normalen« Integer-Operationen und der für den LONGINTEGER-Typ. Wie groß und genau Sie mit Ihrem neuen Typ rechnen können, bestimmt die Konstante »LONGINT_Len«, mit der die Länge des die langen Zahlen aufnehmenden Byte Arrays bestimmt wird. Diese ergibt sich aus der nächstgrößeren Zahl größer oder gleich »LONTGINT_Digits/logm(256)«. Als Beispiel für die Leistungsfähigkeit der Bibliothek wurde ein kurzes Progrämmchen angefügt, das Fakultäten berechnet. |
Tabelle: Turbo-Anweisung Longinteger Anmerkungen z:=x + y LAdd(z, x, y) K. Überlaufprüfung z:=x - y LSub(z, x, y) K. Überlaufprüfung z:=x * y LMul(z, x, y) K. Überlaufprüfung z:=x div y LDiv(z, r, x, y) r:=x mod y x < y LLess(x, y) bool'sche Funktion x:=x shl 1 LShl(x) schneller als x * 2 x:=x shr 1 LShr(x) schneller als x Div 2 readln(x) LRead(x) Eingabe write(x) LWrite(x) Ausgabe, langsam --- IntToLong(x, i) Wandelt Integer i in Langinteger x um |
Listing von LONGINT.PAS |
Beispielprogramm FAK.PAS |
Im Magazin „PASCAL", Ausgabe 8'87, wurden zum obigen Artikel folgende Korrekturen abgedruckt:
|
Listing 3 |
Listing 4 |
Listing 5 |
Eingescanned von
Werner Cirsovius
Januar 2005
© CHIP Verlag