Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   FPU Word $133F existiert nicht (https://www.delphipraxis.net/95607-fpu-word-%24133f-existiert-nicht.html)

user0 10. Jul 2007 10:43


FPU Word $133F existiert nicht
 
Hallo leute,

ich will für mein Programm die FPU-Exceptions abschalten. Ich habe im Internet mehrfach gelesen, dass das per
Delphi-Quellcode:
Set8087CW($133F);
geht. Nur übernimmt der Prozessor diese Einstellung leider nicht.

Ich habe ein Testprogramm geschrieben, dass das FPU-Word auf alle möglichen Einstellungen (0..65535) setzt, und danach prüft, ob die einstellungen übernommen wurden:

Delphi-Quellcode:
...
     function J_Get8087CW: word;
     asm
       FNSTCW result
     end;
     ...
     ListBox_Values.Clear;
     for i := 0 to 65535 do begin
         Set8087CW(i);
         if J_Get8087CW = i then begin
            ListBox_Values.Items.Add('$' + IntToHex(i,4));
         end;
     end;
...
Ausgegeben werden 2048 mögliche einstellungen. $133F ist aber nicht dabei :gruebel:

Weiß jemand warum?

P.S.: Aus $133F wird immer $137F

Hawkeye219 10. Jul 2007 12:32

Re: FPU Word $133F existiert nicht
 
Hallo,

einige Bits im FPU control word sind reserviert und können nicht geändert werden. Offenbar liefert die FPU beim Auslesen des Wortes zumindest für Bit 6 immer den Zustand "gesetzt".

Gruß Hawkeye

user0 10. Jul 2007 15:13

Re: FPU Word $133F existiert nicht
 
Zitat:

Zitat von Hawkeye219
Hallo,

einige Bits im FPU control word sind reserviert und können nicht geändert werden. Offenbar liefert die FPU beim Auslesen des Wortes zumindest für Bit 6 immer den Zustand "gesetzt".

Gruß Hawkeye

Vielen Dank!

Ich habe jetzt eine Funktion geschrieben, die nur die Bits umsetzt, die umgesetzt werden sollen, und können:
Delphi-Quellcode:
function MyCWCheck(cw: word): word;
  begin
     result := cw;

     // Errormessages abschalten
     result := (result or (1 shl 0));
     result := (result or (1 shl 1));
     result := (result or (1 shl 2));
     result := (result or (1 shl 3));
     result := (result or (1 shl 4));
     result := (result or (1 shl 5));

     // Präzision auf Extended (64 Bit) stellen
     result := (result or (1 shl 8));
     result := (result or (1 shl 9));

     // "Normal" runden
     result := (result and not (1 shl 10));
     result := (result and not (1 shl 11));
  end;
Damit geht´s. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz