AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Rechnen mit Strings bzw Sehr großen Zahlen
Thema durchsuchen
Ansicht
Themen-Optionen

Rechnen mit Strings bzw Sehr großen Zahlen

Ein Thema von gmarts · begonnen am 25. Mai 2004 · letzter Beitrag vom 25. Mai 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von gmarts
gmarts
Registriert seit: 4. Apr 2004
Delphi Unit:

4 praktische Funktionen und 2 halbpraktische Funktionen zum Thema Rechnen mit großen Zahlen.
Damit lassen sich Zahlen bis zu (10^2147483648)-1 darstellen und berechnen (Theoretisch, wenn man viel Zeit mitbringt).
Angehängte Dateien
Dateityp: zip kubmstring_140.zip (3,3 KB, 34x aufgerufen)
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Click;
end;
 
Benutzerbild von negaH
negaH
 
#11
  Alt 25. Mai 2004, 21:22
Zitat:
.S.: Hoffentlich habe ich mich nicht verrechnet
Du solltest 3 mal größere Zahlen rechnen können.
Und ja, es ist wesentlich effizienter mit Array of Cardinal statt Strings zu rechnen. Der Durchfluß der Basis Operationen sollte sich dadurch mindestens verzehnfachen.
Es bleibt aber ein ganz kleines Problem: um mit array of Cardinal rechnen zu können muß man einige wichtige Funktionen in Assembler schreiben. JEDE 32 Bit Operation wie ADD, SUB, CMP, MUL und DIV kann auf Intel Systemen verkettet programmiert werden. Zb. wird bei einer Addition einfach sequentiell vom Low zu High Byte per ADC addiert. Ein Dezimaler String würde in einem Cardinal ca. 9 Stellen speichern, man wird also in einer Basisoperation in einem Cardinal Array mehr als 9 Dezimale Operationen durchführen. Statt also 9 mal ADD/ADC würde man mit einem ADD/ADC das gleiche erzielen.

Sogesehen, gibt es keine plausible und logische Begründung NICHT mit array of byte oder array of Cardinal zu arbeiten, statt mit Strings. Ok, einzigste Ausnahme ist das der Coder das bischen Assembler nicht beherrscht.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#12
  Alt 25. Mai 2004, 21:25
@gmarts,

in deinem ZIP finde ich keine Quelltexte sondern nur die DCU.
Aus dieser Sicht sind deine "praktischen" Funktionen leider sehr unpraktisch, denn das einzigste was sinnvoll ist wäre aus deinem Source lernen zu können.
Wenn es um Performance geht, oder um die Anzahl an nützlichen Features, oder Bedienbarkeit, dann gibt es eben viel bessere und praktische Source und Librarys im Netz.

Gruß Hagen
  Mit Zitat antworten Zitat
neolithos

 
Delphi 7 Architect
 
#13
  Alt 25. Mai 2004, 21:27
Zitat von negaH:
Zitat:
.S.: Hoffentlich habe ich mich nicht verrechnet
Du solltest 3 mal größere Zahlen rechnen können.
Äh, Wie jetzt!

255 -> 8 Bit sind doch Pi über Daumen 2,5 Stellen!?!

Zitat von negaH:
Sogesehen, gibt es keine plausible und logische Begründung NICHT mit array of byte oder array of Cardinal zu arbeiten, statt mit Strings. Ok, einzigste Ausnahme ist das der Coder das bischen Assembler nicht beherrscht.
So direkt wollte ich es auch nicht formulieren.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#14
  Alt 25. Mai 2004, 21:30
~ 2,5 Stellen wenn man auf ein Byte rechnet, aber warum sollte man auf einer 32 Bit CPU sich auf 8 Bit Berechnungen konzentieren. Also, Cardinal = 32 Bit ist das Gebot der Stunde, und in einem Cardinal bekommst du 9 dezimale Stellen rein. Ok, 9.7 / 4 ~ 2.5, sogesehen haste Recht und ich mich verrechnet

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von gmarts
gmarts

 
Delphi 6 Enterprise
 
#15
  Alt 25. Mai 2004, 21:30
Zitat von negaH:
@gmarts,

in deinem ZIP finde ich keine Quelltexte sondern nur die DCU.
Aus dieser Sicht sind deine "praktischen" Funktionen leider sehr unpraktisch, denn das einzigste was sinnvoll ist wäre aus deinem Source lernen zu können.
Stimmt! Die Funktionen sind nur schnell dahin geschludert ... und bevor ich den QT hier poste, will ich nen bisschen Ordnung reinbringen.


Tjoa..assemblieren kann ich leider noch nicht.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#16
  Alt 25. Mai 2004, 21:44
Es ist aber auch nicht allzu schwer. Was du benötigst sind 6 wichtige Algorithmen in Assembler.

1. Routine die 3 Cardinal Arrays mit identischer Größe Additiert, also R[] = A[] + B[]
2. Routine die 3 Cardinal Arrays mit identischer Größe Subtrahiert, also R[] = A[] - B[]
3. Routine die 1 Cardinal mit einem Cardinal Array multipliziert, also R[] = A[] * C
4. Routine die 1 Cardinal mit einem Cardinal Array dividiert und modulo rechnet, R[] = A[] / C, M = A[] mod C
5. Routine die ein Carry = Überlauf addiert also R[] = R[] + C
6. Routine die ein Borrow = Unterlauf subrahiert also R[] = R[] - C

Alle weiteren Operationen können nun immer auf obige 6 Algos. zurückgeführt werden.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz