Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wenn INT64 voll ist (https://www.delphipraxis.net/2078-wenn-int64-voll-ist.html)

sakura 6. Jan 2003 13:18

Zitat:

Zitat von DerKapitalist
ich denke die librarys bieten da die beste lösung. Oder meint ihr man könnte dem Compiler 128 bit beibringen *gg*

Nee, der Compiler arbeitet für 32-bit Systeme. 32-bit System unterstützen, von Haus aus, 64-bit Berechnung über das zusammenführen zweier Register. D.h., Delphi setzt auch nur auf diese Funktionalität auf. Die Prozessoren machen nicht mehr.

Wenn Du mehr haben willst, dann bleibt Dir nur der Umweg über oben genannte Bibliotheken.

Christian Seehase 6. Jan 2003 13:35

Moin Kapitalist,

die Idee von Braingrenade stellt im Prinzip nichts anderes dar, als Du mit den Bibliotheken wirst erreichen können (mal abgesehen davon, dass seine Variante wohl deutlich schneller sein dürfte).

Da ja der Compiler maximal mit Int64 umgehen kann wirst Du es innerhalb einer Bibliothek für längere Werte kaum anders machen können, als bei Überlauf den nächsten Int64 um eins zu erhöhen.

Wahrscheinlich wird's sogar oft so ablaufen, dass es für jede Dezimalstelle ein Byte geben wird, so dass die Zahlen intern als dynamisches Byte Array abgebildet werden.

Einfach so als z.B. int64 angeben und dann einfach mit +/- rechnen wird bei solchen Datentypen nicht gehen, da es sich um Objekte handeln dürfte, mit Methoden die das Rechnen übernehmen, und das überladen von Operatoren kennt Pascal ja nun nicht.

Auch wenn's unwahrscheinlich ist, aber:
Eventuell würden solche Objekte in weiteren Delphi Versionen nicht mehr funktionieren, wohingegen das aufaddieren von int Typen wohl auch dort noch funktionieren sollte.

MatrixStormProgrammierer 30. Mai 2003 11:34

ja, es geht größer...
 
Wie es auf dem PC so üblich geworden ist, kann man alles mögliche emulieren. Da nun unsere CPUs nun "nur" 32 Bit Register besitzen, ist theoretisch eine Berechnung in größeren Wertebereichen scheinbar unmöglich...

1.) Tatsache ist jedoch, das es Int64 (64 Bit groß) gibt...
Int64 wird teilweise emuliert und teilweise vom CPU unterstüzt,
indem z.B. der Assemblebefehl "mul" Produkte in eax und edx
aufteilt...

2.) Was ist nun wenn der Int64-Bereich zu Ende geht?
Naja, jede Rechenoperation ist ein Algorithmus (nicht umgekehrt!).
Es gibt also tatsächlich eine Möglichkeit größere Zahlen zu
verwenden. Ein einfaches Beispiel für eine 2048 Bit große Zahl
möchte ich kurz für den Befehl "inc" erläutern, bei weiteren Fragen
schreibt mir einfach per ICQ, 70036952.

Um alle Daten einer 2048 Bit (256 Byte) großen Zahl zu erfassen benötigen wir ein Feld aus Bytes... (ich empfehle Bytes, und nicht etwas größere Zahlentypen).

Delphi-Quellcode:
                 type mynumber = array[0..$ff] of byte;
Ein Befehl inc für den Typ "mynumber" würde also z.B. so aussehen:
Delphi-Quellcode:
procedure inc(var num : mynumber;BytesSummand : byte); overload;
var
    i,
    zwischenerg : word; // besser, falls jemand größere Zahlen nimmt
begin
 zwischenerg:=word(ByteSummand);
 for i:=0 to sizeof(mynumber)-$1 do
  begin
   zwischenerg:=(zwischenerg and $ff) + num[i];
   num[i]:=zwischenerg and $ff;
   zwischenerg:=zwischenerg shr $8;
   if (zwischenerg = 0) then break; // kein Rest da...
  end;
end;
ps: hab das eben auf "die Schnelle" geschrieben, falls es nicht funzt, meldet euch bitte...

cu sagt MatrixStormProgrammierer...

Illuminator-23-5 2. Jun 2003 09:58

große zahlen
 
es gibt auch eine andere, lustige methode, mit großen zahlen exakt zu rechnen: ein string ist 255 Zeichen lang. Wenn man eine 255-Stellige zahl hat, wie weit kann man damit zählen? und eins dazuaddieren ist auch ganz einfach :

i := length(zahl);
while zahl[i] = 'F' do begin
Zahl[i] := '0';
dec(i);
end;

Zahl[i] := IntToStr(StrToInt(zahl[i])+1);

Christian Seehase 2. Jun 2003 10:02

Moin Illuminator,

Zitat:

Zitat von Illuminator-23-5
ein string ist 255 Zeichen lang.

Ein ShortString schon, aber der übliche HugeString kann, theoretisch, bis zu ca. 2GB Zeichen aufnehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 Uhr.
Seite 2 von 2     12   

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