Je suis en cours d'exécution dans un problème avec des exceptions en virgule flottante est activée dans Visual Studio 2005. Si je code comme ceci:pile à virgule flottante manutention avec des exceptions en virgule flottante sous tension
double d = 0.0;
double d2 = 3.0;
double d3 = d2/d;
et si je me inscrire une routine de gestionnaire SEH, alors je peux facilement transformer le div-by-zero en une exception C++ et l'attraper. Jusqu'ici tout va bien.
Cependant, lorsque je fais cela, le premier opérande (0.0 dans l'exemple ci-dessus) est laissé sur la pile de registres FPU. Si je le fais huit fois, alors je commencerai à obtenir une exception de vérification de pile à virgule flottante avec TOUTES les opérations à virgule flottante à partir de maintenant.
Je peux m'occuper de ceci en utilisant un bloc __asm pour exécuter un FSTP, faisant ainsi sortir la valeur parasite de la pile, et tout va bien.
Cependant, cela m'inquiète, parce que je n'ai pas vu cela discuté partout. Comment puis-je être certain du nombre de valeurs que je devrais afficher? Est-il sûr de simplement faire apparaître tout ce qui est sur la pile au moment de l'exception? Existe-t-il des meilleures pratiques recommandées dans ce domaine?
Merci!
Est-ce que ça arrive aussi avec SEH? Si vous ne vous inscrivez pas, le gestionnaire SEH se comporte-t-il de la même manière? –
Cela arrive à la suite de l'appel _controlfp() qui démasque les exceptions qui m'intéressent (comme div-by-zero). Je ne pense pas que cela soit important si j'ai un gestionnaire SEH enregistré ou non - mais si je ne le fais pas, je tombe en panne avec une exception non gérée. –