Darfst du schon. Das X87 Control Word besteht aus mehreren Bits, die unterschiedliche Bedeutungen haben.
Nähere Infos dazu entnimmst du am besten der "Intel Architecture Software Developer's Manual; Vol I: Basic Architecture".
Was RC angeht, sind hier die relevanten Werte:
Code:
Round to nearest even = $00B
Round down toward infinity = $01B
Round up toward infinity = $10B
Round toward zero (trunc) = $11B
Habe gesten nachmittag auch das Dokument noch gefunden. Ist dort recht gut erklärt.
Kann gut sein, dass nur die
Exception Masks geändert wurden. Ich schaue mal nach .. Edit: Ja genau z.b. zwischen 4991 und 4962 ändern sich nur die
Exception Masks.
Hier mal die Bit-Schreibweise meiner Werte:
Code:
keine Berücksichtigung
Dec Hex C RC
Exception von mir
4991 137F 0001 0011 0111 1111 Delphi vor erster Start
610 262 10 0110 0010 nach 1. Aufruf
610 262 10 0110 0010 folgende Aufrufe
I PC Schutz mit try ...
Dec Hex C RC
Exception finally
4991 137F 0001 0011 0111 1111 Delphi vor erster Start
610 262 10 0110 0010 nach 1. Aufruf
4962 1362 0001 0011 0110 0010 folgende Aufrufe
I PC Schutz mit try...
Dec Hex C RC
Exception finally + Setzen "37F"
4991 137F 0001 0011 0111 1111 Delphi vor erster Start
895 37F 11 0111 1111 manuell gesetzt
610 262 10 0110 0010 nach 1. Aufruf
895 37F 11 0111 1111 manuell gesetzt
866 362 11 0110 0010 folgende Aufrufe
I PC Schutz mit try...
Dec Hex C RC
Exception finally + Setzen "262"
4991 137F 0001 0011 0111 1111 Delphi vor erster Start
610 262 10 0110 0010 manuell gesetzt
610 262 10 0110 0010 nach 1. Aufruf
610 262 10 0110 0010 manuell gesetzt
610 262 10 0110 0010 folgende Aufrufe
Fazit:
- die Dll setzt sich immer die gleiche Exception Mask
- Der Rundungs-Modus (RC) wird nicht geändert
- Infinity wird zwar geändert, spielt aber entsprechend der Dokumentation aus dem Link keine Rolle:
Zitat:
8.1.6 Infinity Control Flag
The infinity control flag (bit 12 of the x87 FPU control word) is provided for compatibility with the Intel 287 Math
Coprocessor; it is not meaningful for later version x87 FPU coprocessors or IA-32 processors. See Section 4.8.3.3,
“Signed Infinities,” for information on how the x87 FPUs
handle infinity values.
Ist der Wert also jetzt egal?
- es gibt ggf. eine Abweichung bei Precision Control (PC), mögliche Werte
Code:
Precision PC Field
Single Precision (24 bits) 00B
Reserved 01B
Double Precision (53 bits) 10B
Double Extended Precision (64 bits) 11B
-> erster Aufruf läuft immer auf "Double Precision", folgende auf "Double Extended Precision", falls der vorherige Wert nicht übereinstimmt. Ich habe mir nicht die genauen Gründe angesehen. Das werde ich mit den Erstellern der dll abklären. Wenn ich dort einfach auch "262" setze, dann wird der Wert nicht geändert.
- Durch die .dll wird die Eigenschaft des "x87 FPU Control Word" für das Programm verstellt, ich muss/sollte also mir vorher den Wert merken und ich nachher zurücksetzen.
Zitat:
Erst wenn ich die Rundungs-Funktion mit "lAnzahlNachkommaStellen + 1" aufrufe, scheint es so, dass ich ein reproduzierbares Ergebnis bekomme...
Das ist genau der richtige Ansatz!
Ich wollte gerade sagen. Das kann es nicht sein, dass man für eine solche Funktion der Maßen tief in den Prozessorinstruktionen eingreifen muss. Wenn das der Fall ist, dann macht man irgendwas verkehrt.
Das wäre mir auch lieber. Aber es hat sich leider bei mir gezeigt, dass auch mit der Rundung andere Ergebnisse (an anderer Stelle) von den "Format" und "ToStr"- Funktionen ausgegeben werden (also wird das Round... schon irgendwie anders arbeiten).
Daher ist das "try ... finally" zum "Merken und Zurücksetzen" schon notwendig, denke ich.
Vielen Dank für eure Hilfe!