010
28.10.2004, 23:15 Uhr
Spacelord
Hoffnungsloser Fall
|
Windows initialisiert die Gleitkommaeinheit so das keine Ausnahmen generiert werden.
Aus nem Artikel von Matt Pietrek:
Zitat von : |
..... Creating the floating point exceptions was somewhat tricky, as Win32 initializes the floating point unit to not generate exceptions. I had to explicitly turn off certain bits in the coprocessor's control word to get the floating point exceptions, like STATUS_FLOAT_DIVIDE_BY_ZERO. If you're curious, the UnmaskFPExceptionBits function contains the relevant bit-twiddling code. I also learned the hard way that floating point instructions aren't raised until the next floating point instruction after the actual bad instruction. I used the __asm fwait instruction to force exceptions to be raised immediately after the intentionally bad instruction. .......
|
@Tommix: Änder dein erstes,lauffähiges Beispiel mal so ab:
C++: |
#include <stdio.h>
int main () { unsigned short cw; __asm fninit __asm fstcw [cw] cw &= 0xffe0; __asm fldcw [cw]
try { double a = 1.0, b = 1.0; double c = 1.0/(a-b);
printf ("%f\n", c); } catch(...) { printf("Fehler\n"); }
return 0; }
|
Den gleichen Effekt den die Assembleranweisungen oben haben erreicht man auch so:
C++: |
#include <float.h> ..... _controlfp(~_EM_ZERODIVIDE ,_MCW_EM); ......
|
Das die zweite Version nicht läuft hat ja nicht mit Exceptions oder so zu tun,da erkennt der Compiler halt auf Anhieb dass es ne Division durch 0 ist.
In einem meiner Bücher ist das merkwürdige Verhalten von Gleitkommazahlen bei der Division durch Null auch über mehrere Seiten beschrieben aber warum das letztendlich so ist.....
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. Dieser Post wurde am 29.10.2004 um 00:14 Uhr von Spacelord editiert. |