FPU-Debug-Fenster in VC++



  • Gibts in VC++ ein Debug-Fenster, in dem ich mir ansehen kann, wie das FPU-Controll-Word gesetzt ist?



  • Beim VC6 wird's angezeigt, bei den späteren vermutlich auch.



  • dass es angezeigt wird, dacht ich mir auch. Nur: wo? 😉



  • Noch ne Frage:

    Ich lass mir das FPU-Controlword auf die Konsole ausgeben:

    _control87( 0x027F, 0xFFFF);
    int word( _control87( 0, 0));
    std::cout << std::hex << word << std::endl;

    Mit dem C++Builder compiliert erscheint auf der Konsole '27F', also der Wert, auf den ich das Controlword gesetzt habe.
    In VC++ erscheint hingegen '9021f'. Mach ich irgendwas mit der Formatierung der Ausgabe falsch oder ist das Flag tatsächlicht falsch gesetzt?



  • debug->window->register und im fenster rechts klicjen und die gewüschten regs aussuchen.

    hast du die anzeige der flags im release versucht?



  • ok, danke.

    Dann mach ich aber irgendwas falsch beim setzen (wie die Konsolenausgabe ja andeutet):

    Beim Programmstart steht ist lt Registerfenster

    'CTRL = 027F'

    gesetzt.

    Jetzt ruf ich

    _control87( 0x027F, 0xFFFF);

    auf. Danach ist

    'CTRL = 0A7F'

    Warum? Ich habs doch auf den Wert gesetzt, der es vorher war. Es dürfte doch nix ändern????

    Derselbe Code mit dem C++Builder übersetzt, verhält sich wie erwartet.
    Sowohl realease als auch debug-Compilate liefern bei VC++ dasselbe (komische) Ergebnis.



  • hm, kapier ich irgendwie nicht:

    float.h beim BCB:

    #define MCW_EM              0x003f  /* interrupt Exception Masks*/
    #define     EM_INVALID      0x0001  /*   invalid                */
    #define     EM_DENORMAL     0x0002  /*   denormal               */
    #define     EM_ZERODIVIDE   0x0004  /*   zero divide            */
    #define     EM_OVERFLOW     0x0008  /*   overflow               */
    #define     EM_UNDERFLOW    0x0010  /*   underflow              */
    #define     EM_INEXACT      0x0020  /*   inexact (precision)    */
    

    float.h bei VC++

    #define _MCW_EM         0x0008001f              /* interrupt Exception Masks */
    #define _EM_INEXACT     0x00000001              /*   inexact (precision) */
    #define _EM_UNDERFLOW   0x00000002              /*   underflow */
    #define _EM_OVERFLOW    0x00000004              /*   overflow */
    #define _EM_ZERODIVIDE  0x00000008              /*   zero divide */
    #define _EM_INVALID     0x00000010              /*   invalid */
    #define _EM_DENORMAL    0x00080000              /* denormal exception mask (_control87 only) */
    

    Warum sind die Werte bei beiden völlig unterschiedlich???



  • weli man nicht hardcoden sollte... 😉


Anmelden zum Antworten