![]() |
wenn INT64 voll ist
Hi!
ich hab da mal ne theoretische Frage. Angenommen ich hab ein Programm, das z.B. Daten mitließt, einen Netzwerkscanner zum Beispiel, und fuer jedes Byte das vorbeisaust mach ich position := position + 1. Wenn jetzt irgendwann in ferne zukunft mein position: int64 voll sein sollte, was mach ich dann eigtl.? kann man das noch erweitern? ich hab mir schon gedacht ein dynamisches Array aus lauter int64 aufbauen, aber damit rechnen is ja auch nicht gerade schoen. gibt es ne möglichkeit, die ordinalen Datentypen so zu erweitern, dass ich sie immernoch ganz normal verwenden kann, so sagen wir, bis der speicher voll ist *g*? wie wuerdet ihr das lösen, ohjee jetzt is schon wieder spät.. gut, dann stoert mich niemand :-) !danke! |
Such in delphi mal nach Extended, das sind Fließkommazahlen, die aber auch eine weiteren Zahlenbereich haben
|
Zitat:
|
gut, danke, werd ich mal schaun.
gibt es einen größeren Datentyp (vorzugsweise unsigned) als int64? (ausser extended, der ja nich richtig funktionieren soll) Er muss einfach genauso funktionieren wie ein stinknormaler integer, und er sollte nich "irgndwann mal ungenau" werden. danke! |
Noch gibt es nichts größeres in Delphi, da müssen wir erst auf eine 64-bit Version warten, welche dann auch 128-bit Integer unterstützen könnte.
|
Zitat:
![]() Allerdings rechnet das dann die CPU nich mehr direkt, so daß es langsamer geht. Thomas |
@fiasko: Bevor Du mich aus dem Zusammenhang ins Falsche hinein interpretierst, lies bitte alles. Mein erster Beitrag hat auch auf Ausweichmöglichkeiten hingewiesen ;)
|
@fiasko:
weißt du wie das arbeitet? wird dann eine sagen wir 1024bit CPU auf die gängigen 32 Bit emuliert? Ist das dann 1024/36 mal langsamer? danke |
Moin !
mach doch einfach ne zeite varible , die sobald position 10000 erreicht um eins eröht wird , und dann setzt du position wieder auf 0 und machst weiter! |
danke fuer den tip.
es geht aber darum, das delphi-kompatibel zu lösen. Was nutzt mir das, wenn ich die variable extern weiterverabeiten muss (als Beispiel). Bei dem was du meinst bietet sich wohl ein dynamisches array am ehesten an... ich denke die librarys bieten da die beste lösung. Oder meint ihr man könnte dem Compiler 128 bit beibringen *gg* gruss |
Zitat:
Wenn Du mehr haben willst, dann bleibt Dir nur der Umweg über oben genannte Bibliotheken. |
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. |
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:
Ein Befehl inc für den Typ "mynumber" würde also z.B. so aussehen:
type mynumber = array[0..$ff] of byte;
Delphi-Quellcode:
ps: hab das eben auf "die Schnelle" geschrieben, falls es nicht funzt, meldet euch bitte...
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; cu sagt MatrixStormProgrammierer... |
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); |
Moin Illuminator,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz