AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Langzahlen

Langzahlen

Ein Tutorial von Dipl Phys Ernst Winter · begonnen am 24. Mai 2009 · letzter Beitrag vom 9. Nov 2009
Antwort Antwort
Dipl Phys Ernst Winter
Registriert seit: 14. Apr 2009
Langzahlen mit der Unit LZahl80
Der Zahlentyp Comp erfasst zwar die ganzen Zahlen in einem 18-stelligen Bereich lückenlos, stellt jedoch keine ganzzahlige Division mit Rest bereit. Eine solche steht in Delphi nur für Zahlen im Bereich von LongInt zur Verfügung.
Der Bereich der ganzen Zahlen des Typs LongInt reicht jedoch manchmal nicht aus. Er soll daher durch einen Typ LZahl erweitert werden. Von dem wir fordern:
1. Der Typ soll beliebig weit ausdehnbar sein,
2. Delphis Integertypen und Strings mit ganzen Zahlen sollen sich in Langzahlen wandeln lassen,
3. Langzahlen sollen sich als Dezimalzahlstrings ausgeben lassen,
4. Langzahlen sollen sich vergleichen lassen,
5. Eine Arithmetik mit Addition, Subtraktion, Multiplikation und ganzzahliger Division mit Rest
6. Ein reeller Quotient zweier Langzahlen soll gebildet werden können.

Naheliegend ist zunächst die Realisierung als Dualzahl in 2er-Komponentdarstellung, gespeichert in einem Array von Doppelworten. Dazu gibt Delphi jedoch kaum Unterstützung. Es fehlt schon ein vorzeichenloser Typ mit 32bit Breite, da Cardinal die Vorzeichenstelle von Integer nicht nutzt! Die Unit wäre fast vollständig in Assembler zu schreiben, vom Debugger ist dann kaum noch eine brauchbare Unterstützung zu erwarten.

Die Unit LZahl80 geht daher einen anderen Weg und definiert den Langzahlen Typ mit
Delphi-Quellcode:
const
  N = 20; // für Stellenzahl 4*N = 80
type
  LZahl = record // Zahlentyp Langzahl
            s : boolean; // Vorzeichen
            w : array[1..N] of word end; // Betrag, 4 Stellen/Word
Jedes Wort im Arrays enthält eine Langzahl-Stelle mit einem Stellenwert 0..9999, der 4 Dezimalstellen entspricht. Damit wird erreicht:
 alle Operationen mit den Langzahl-Stellen können in Pascal geschrieben werden,
 die Anzeige einer Langzahl im Debugger erscheint nahezu als Dezimalzahl, es fehlen in den Stellen nur die führenden Nullen.

Die Verbindung zwischen den Langzahlen und der übrigen Welt wird über Strings hergestellt mit
Delphi-Quellcode:
function LVal(s: string; var z: LZahl): integer; // String in Langzahl
procedure LStr(const z: LZahl; var s: string); // String aus Langzahl
Für Vergleiche von Langzahlen stehen zur Verfügung:
Delphi-Quellcode:
function LCompAbs(x, y : LZahl): integer; // Vergleich Betrag Langzahl
function LComp(x, y: LZahl): integer; // Vergleich von Langzahlen
Die Arithmetik von Langzahlen ist implementiert mit:
Delphi-Quellcode:
procedure LAbs(var z: LZahl);     // Betrag einer Langzahl
procedure LNeg(var z: LZahl);     // Negation einer Langzahl
function LAdd(var z: LZahl; x, y: LZahl): integer; // Addition
function LSub(var z: LZahl; x, y: LZahl): integer; // Subtraktion
function LMul(var z: LZahl; x, y: LZahl): integer; // Multiplikation
function LDiv(var z, Rest: LZahl; x, y: LZahl): integer; // Division mit Rest
function LQuotStr(var Q: string; x, y: LZahl; d: integer): integer; // Quotient
Die Funktionen geben einen Fehlercode 0 zurück, wenn sie fehlerfrei ausgeführt wurden. Man Beachte, dass das Ergebniss z in die Variablen x bzw. y der Operatoren eingeschrieben werden kann.
Zum Quotient zweier Langzahlen:
Es existiert kein Zahlentyp, der den Quotienten zweier Langzahlen mit durch die Operanden gegebenen Bereich und Genauigkeit aufnehmen kann. Daher stellt die Funktion LQuotStr diesen nur als String dar.
d ist die gewünschte Stellenzahl hinter dem Dezimalpunkt. Mit d=0 wird die durch die Operanden signifikante Anzahl von Stellen ausgegeben.
Anmerkung: Mit veränderter Konstanten N kann die Unit für beliebige Stellenzahlen 4*N compiliert werden.
procedure LStr(const z: LZahl; var s: string); // String aus Langzahl Überarbeitet, gibt jetzt immer einen String der Länge 4*N zurück, in dem die Zahl rechtsbündig steht.
Wieder zur Übernahme der Parameter über den Stack zurückgekehrt. Habe die Übernahme per const nicht gepackt.
Im Attachment der Code mit einem Testproramm.
Angehängte Dateien
Dateityp: zip lzahltest_869.zip (129,3 KB, 23x aufgerufen)
Dateityp: zip langzahl_314.zip (132,8 KB, 27x aufgerufen)
Autor: DP Ernst Winter
 
9. Nov 2009, 12:15
Dieses Thema wurde von "Daniel G" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Tutorials und Kurse" verschoben.
Autor hatte den Beitrag schon bearbeitet...
Benutzerbild von himitsu
himitsu

 
Delphi 10.4 Sydney
 
#3
  Alt 9. Nov 2009, 12:29
OH
Der Typ Comp (für "computational") ist ein natives Format der Intel-Prozessorarchitektur und stellt einen 64-Bit-Integer dar. Er ist dennoch als reeller Typ klassifiziert, weil sein Verhalten nicht dem eines ordinalen Typs entspricht. Ein Comp-Wert kann beispielsweise weder inkrementiert noch dekrementiert werden. Comp ist nur aus Gründen der Abwärtskompatibilität vorhanden.


Zitat von Dipl Phys Ernst Winter:
Der Zahlentyp Comp erfasst zwar die ganzen Zahlen in einem 18-stelligen Bereich lückenlos, ...
Hier wäre ein Int64 wohl besser geeignet.
Vom Wertebereich her sind ja beide Typen gleich.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 10.3 Rio
 
#4
  Alt 9. Nov 2009, 13:31
IIRC gab es unter Delphi 3 noch kein Int64.
Detlef
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 10.4 Sydney
 
#5
  Alt 9. Nov 2009, 13:33
OK, das hab ich ganz übersehn/vergessen
(bin ja auch erst seit D4 dabei)

Dann wenigstens Comp/Int64
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 10.4 Sydney
 
#6
  Alt 9. Nov 2009, 14:32
Und wieviele ahben noch D3?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 10.4 Sydney
 
#7
  Alt 9. Nov 2009, 14:36
Viele Lehrer und dann auch genügend Schüler, welche es von diesen haben.

PS: hab mir vor 2 Wochen ein D3 gekauft
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf