Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Teiler Problem einam da einmal nicht da

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
29.10.2004, 08:49 Uhr
Tommix



'Morgen,

Zitat von Spacelord:

_controlfp(


Das hatte ich im Hinterkopf, aber im MSDN sucht man sich tot, wenn man das richtige Stichwort nicht weiß. Z.B. ist

Zitat von MSDN "division operator /":

Division by 0 in either a division or a modulus expression is undefined and causes a run-time error. Therefore, the following expressions generate undefined, erroneous results:

i % 0
f / 0.0


eine widersprüchliche Aussage: Ist das Ergebnis nun undefiniert, oder wird ein Laufzeitfehler erzeugt?
Was sagt der Standard eigentlich dazu?

Gruß, Tommix


Bearbeitung von Tommix:

Ich seh gerade: Dein Beispiel stürzt im Release-Modus ab (da generiert der Compiler aber vorher Warnungen).


Dieser Post wurde am 29.10.2004 um 08:54 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
29.10.2004, 09:06 Uhr
ao

(Operator)



Zitat von Tommix:
"Division by 0 in either a division or a modulus expression is undefined and causes a run-time error. Therefore, the following expressions generate undefined, erroneous results!"
eine widersprüchliche Aussage: Ist das Ergebnis nun undefiniert, oder wird ein Laufzeitfehler erzeugt?

Richtig lesen: "Division durch 0 in einem Divisions- oder Modulo-Ausdruck ist undefiniert und verursacht einen Laufzeitfehler." Kein Widerspruch.

ao


Bearbeitung von ao:
verdammt noch mal, bin ich jetzt zu blöd, um zwei geschachtelte quotes hinzukriegen??? Dann halt anders.

Dieser Post wurde am 29.10.2004 um 09:08 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
29.10.2004, 11:33 Uhr
Tommix



Ja, aber der zweite Satz paßt meines Erachtens nicht zum ersten:

Zitat:

... the following expressions generate undefined, erroneous results!



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
29.10.2004, 20:02 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von Tommix:
Was sagt der Standard eigentlich dazu?

Gruß, Tommix


Bearbeitung von Tommix:

Ich seh gerade: Dein Beispiel stürzt im Release-Modus ab (da generiert der Compiler aber vorher Warnungen).




Bei mir laufen beide Versionen(ASM und _controlfp) auch im Release Mode .
Naja ist ja letztendlich auch egal.Ging ja eigentlich nur drum zu zeigen dass "normalerweise"
garkeine float divide by zero Exception geschmissen wird und dass es diese aber durchaus gibt.

Was der Standard dazu sagt kann ich dir auch nicht sagen(da sind virtual und 0xdeadbeef mit absoluter Sicherheit die besseren Ansprechpartner) aber wahrscheinlich legt dieser nur fest dass das Ergebnis einer Division durch 0 INF ist.
Wenn du das catch Statement auf catch(exception) änderst bekommst du ne unbehandelte Ausnahme.Wenn die Exception also nicht von nem catch Block abgefangen wird der die Basisklasse der Standard exceptions abfängt sieht der Standard offensichtlich überhaupt keine Division durch 0 vor!?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: