Über den Datentyp Extended ist ja bekannt, dass dieser im 64Bit-Code nur 8 Bytes groß ist, während er im 32Bit-Code 10 Bytes lang ist.
An einigen Stellen warnt Embarcadero auf seiner Webseite davor, den 10 Bytes großen Extended-Datentyp zu verwenden, ohne die Probleme wirklich ganz konkret zu nennen.
Es gibt nur wenige die Programmiersprache Delphi beschreibende Webseiten, die Angaben über den darstellbaren Zahlenbereich von Extended machen.
Embarcadero gibt an: 3.37e-4932 .. 1.18e+4932 bei 10 Bytes, 2.23e-308 .. 1.79e+308 bei 8 Bytes.
( siehe
docwiki.embarcadero....fache_Typen_(Delphi) )
Inzwischen bin ich auf ein Problem gestoßen.
Gegeben sei dieser Quellcode als vereinfachtes Beispiel, compiliert in 32 Bit mit Delphi 7, ausgeführt auf Windows 7 Professional 64 Bit,
eZahl und eMant seien Extended-Variablen, iExp eine Integer-Variable:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| eMant := 1e3670; iExp := 0; repeat eMant := eMant / 10; iExp := iExp +1; until eMant < 10; |
Die repeat-until-Schleife soll hier so oft durchlaufen werden, bis eMant < 10 ist.
Bei 1e4900 passiert das auch, auch bei z.B. 1e3670 und 1e4225, der Zähler iExp hat zuletzt den Wert des 10er-Exponenten.
Aber in dem Eingabebereich von 1e3671 bis 1e4224 hat eMant zuletzt den Wert 10, nicht 1 !
Man kann auch am Zähler iExp sehen, dass die Schleife im Problembereich 1x weniger durchlaufen wird als der Exponent groß ist.
Übrigens kann man dies auch bei Delphi 7 beobachten!
Selbst auf einem alten 32Bit-Rechner mit Windows XP zeigt sich dieser Fehler.
In einem 64Bit-Programm habe ich einen solchen Fehler noch nicht beobachtet.
Mir stellt sich die Frage, ob die Extended-Variable für Vergleichsoperationen unzulässig ist.
In meinem etwa 1200 Seiten starken Delphi-Buch steht scheinbar nichts davon.
Moderiert von Christian S.: Delphi-Tags hinzugefügt