Hallo,
neulich habe ich hier erfahren, dass der Datentyp Extended auf 64-Bit-Anwendungen nicht wie auf 32-Bit-Anwendungen 10 Bytes,
sondern nur noch 8 Bytes groß ist, also so groß wie Double.
Nun hat es mir den Anschein, dass ich jetzt auch erfahren habe, warum das so ist.
Auf der Webseite von Embarcadero
docwiki.embarcadero...._auf_Double_(Delphi)
fand ich folgende Hinweise:
Zitat: |
Gleitkommaoperationen mit einer "extended"-Genauigkeit werden von Delphi-Compilern für 32-Bit-Plattformen, aber nicht von Delphi-Compilern für 64-Bit-Plattformen unterstützt.
In Delphi-Compilern für 64-Bit-Plattformen wurde die Genauigkeit von Gleitkommaberechnungen von extended (10-Byte-Werte) auf double (8-Byte-Werte) reduziert. Die Verwendung von Gleitkommawerten mit der Genauigkeit "extended" wird nicht empfohlen. Die Intel x86-Architektur unterstützt reelle 10-Byte-Datentypen, aber der Trend bei neuen Prozessorarchitekturen geht zum parallelen Ausführen von Gleitkommaberechnungen mit einer Genauigkeit von höchstens "double" (siehe Intel® Streaming SIMD Extensions). |
Daraus schließe ich, dass in 32-Bit-Anwendungen Extended-Berechnungen in mehreren gleichzeitig laufenden Threads in den heutigen Mehrprozessorkern-Systemen nicht mehr durchgeführt werden können.
Wie ich darauf komme?
Nach dem ich zuerst eine 64-Bit-Anwendung mit Multithreading-Betrieb mit Delphi Berlin (10.1) erstellte, die aber möglicherweise wegen der Extended-Beschränkung nicht die erwarteten Ergebnisse brachte, stellte ich auf 32 Bit um, damit Extended wieder 10 Bytes groß ist.
Doch während die 64-Bit-Anwendung ohne Laufzeitprobleme läuft, gibt es in der 32-Bit-Anwendung gleich am Programmanfang stets Thread-Abstürze.
Das Multithreading habe ich mit der Delphi Class TThread realisiert, was ja auch bereits in Delphi 7 schon machbar war.
Jeder Thread führt Berechnungen mit Extended-Variablen aus und läuft von alleine zu Ende, teilweise zeitgleich mit anderen Threads.
Mein Rechner ist ein 4-Prozessorkern-Rechner mit einem 64-Bit-Betriebssystem Windows 7.
Im Debugging kam stets die Meldung "floating point invalid operation at ..." auf einer Addition-Anweisung mit sehr kleinen Extended-Zahlen im Bereich von E-20.
Da Fehlermeldungen bekanntlich nicht immer den Kern des Problems treffen, habe ich das Programm auf Zugriffskonflikte untersucht, jedoch ohne dabei fündig zu werden.
Meine Frage ist: Habe ich die Sätze von der Embarcadero-Webseite mit meiner darunter stehenden Schlussfolgerung richtig verstanden?
Auch Anmerkungen dazu sind mir willkommen.
LG hjl