Zahlentypen DELPHI5

Liebe Wissende
Ich habe einen fürchterlichen Knopf ind der Leitung.
Folgende Schleife geht reibungslos:

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=1 to 3 do
showmessage(IntToStr(i));
end;

Jetzt muss ich die Sache jedoch mit einem „extended“-Typ machen und habe naiv probiert:

procedure TForm1.Button1Click(Sender: TObject);
var e : extended;
begin
for e:=1 to 3 do
showmessage(„ja“);
//showmessage(IntToStr(e)); // geht schon gar nicht!
end;

Das geht nicht, offenbar weil e nicht „ordinal“ ist. Wie kann ich aus e einen Wert machen, der als Zähler akzeptiert wird?
Ich habe generell Probleme mit diesen Typen und wäre an Hinweisen auf leicht verständliche Erklärungen sehr dankbar.
Schon jetzt besten Dank
Erich

Nun, dass der Compiler das nicht erlaubt, ist konsequent. Denn Intel-Prozessoren stellen extra ein Register zur Verfügung, für sogentannte Loop-Variablen (also Zähler) um Programme zu beschleunigen. Dieses Register ist (ja eigentlich logisch, numerisch bzw. ordinal)

Soviel zum Background :wink:

Du könntest nun theoretisch deinen Extended-Zählen in einen Integer umwandeln (casten) beispielsweise mit Round oder Trunc - aber entsprechend obigem Grundlagenwissen - totaler Quatsch. Der Zähler einer Schleiffe muss/sollte immer numerisch sein. Andere Sprachen (z. B. C#) erlauben auch nichts anderes…

Selbstverständlich kannst Du jedoch innerhalb der Schleife mit deinem Extended-Typ machen was zu willst:

var
 e: Extended;
 i: Integer;

begin
 e := 0;
 for i := 1 to 3 do
 begin
 e := Round(i);
 ShowMessage(FloatToStr(e));
 end;
end;

Hallo Roger

var
e: Extended;
i: Integer;

begin
e := 0;
for i := 1 to 3 do
begin
e := Round(i);
ShowMessage(FloatToStr(e));
end;
end;

Vorerst mal vielen Dank für die Klärung, (FloatToStr ist mir neu. Wo findet man eine Liste ALLER Funktionen, oder gibt es so viele, dass man nicht einmal eine Liste erstellen kann ??), ABER:
Ich habe mein Beispiel offenbar zu sehr vereinfacht. Es ist genauer so, dass ich die Variable „e“ mit einer Funktion mitbringe, UND deren Wert übersteigt den zulässigen Bereich für Integer (=2147483647)! Deshalb kann ich nicht einfach mit ROUND o.ä. umwandeln, da es sonst den Schwanz einfach abschneidet, oder liege ich da falsch? Gibt es dafür überhaupt eine Lösung?
Bitte nochmals um einen Kommentar dazu, in der Zwischenzeit werde ich weiter „experimentieren“.
Erich

Hallo,

deren Wert übersteigt den zulässigen Bereich
für Integer (=2147483647)!

es gibt noch den Typ Int64, dessen Grenze liegt bei ±2^63

Gruß, Niels

Wo findet man eine Liste ALLER Funktionen

In der Help :wink:
Meistens heissen sie ToStr (sollte über Find zugänglich sein)

Ich habe mein Beispiel offenbar zu sehr vereinfacht. Es ist
genauer so, dass ich die Variable „e“ mit einer Funktion
mitbringe, UND deren Wert übersteigt den zulässigen Bereich
für Integer (=2147483647)! Deshalb kann ich nicht einfach mit
ROUND o.ä. umwandeln, da es sonst den Schwanz einfach
abschneidet, oder liege ich da falsch? Gibt es dafür überhaupt
eine Lösung?

Typkonvertierungen möglichst nur ausführen, wenn sie auch benötigt werden, casting ist immer auch CPU-intensiv. Wenn Du Werte erwartest, die den Bereich eines 32bit-Integers wirklich sprengen, kannst Du in der Tat auf Int64 ausweichen, der sollte es auch schon in Delphi 5 gegeben haben.

Dank an Roger und Niels
Ich glaube, ich habe es (halbwegs) begriffen. Jetzt werde ich es durch „trial and error“ noch verinnerlichen.
Erich

Deshalb kann ich nicht einfach mit

ROUND o.ä. umwandeln, da es sonst den Schwanz einfach
abschneidet, oder liege ich da falsch? Gibt es dafür überhaupt
eine Lösung?

Du kannst auch mit FloatToStr F umwandeln und gleichzeitig runden. Das Runden geschieht genauer und dein „Schwanz“ wird erst sehr weit hinten abgeschnitten :smile:

Ciao - JENS