Comment puis-je utiliser try...catch de catch à virgule flottante erreurs?
Je suis à l'aide de c++ dans visual studio express pour générer des arbres d'expression pour une utilisation dans un algorithme génétique type de programme.
Parce qu'ils sont aléatoires, les arbres produisent souvent: division par zéro, dépassement de, dépassement de capacité ainsi que le retour "inf" et d'autres chaînes. Je peux écrire des gestionnaires d'événements pour les chaînes, mais la littérature m'a laissé perplexe les autres. Si je comprends bien, je dois mettre des drapeaux en premier?
Des conseils et/ou un pointeur vers la littérature serait appréciée.
Edit: les valeurs renvoyées dans la variable de type double sont 1.#INF ou -1.#IND. J'ai eu tort de les appeler des chaînes.
- C++ n'est pas de dicter une quelconque de ces opérations doit lever une exception. Ils conduisent à un comportement indéfini. (Qui peut tomber en panne, ou lever une exception, ou ne rien faire, o ...)
- Mais C99 et POSIX ne précise ces choses, et de fournir numérique à l'exception de l'interface. Cependant, il est un peu difficile de savoir si Pierre a le contrôle sur le réel numériques, s'il devient chaînes plutôt que de FP infinis.
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr de vouloir les attraper au lieu de simplement les ignorer? En supposant que vous voulez simplement de les ignorer:
Voir ceci:
http://msdn.microsoft.com/en-us/library/c9676k6h.aspx
Pour la _MCW_EM masque, de compensation le masque définit l'exception, ce qui permet à l'exception de matériel; le réglage du masque de l'exception.
De sorte que vous allez vouloir faire quelque chose comme ceci:
De la confusion ici peut-être plus de l'utilisation du mot "exception". En C++, c'est généralement en se référant à la langue intégrée de la gestion des exceptions du système. Virgule flottante exceptions sont une autre bête tout à fait. Les exceptions standard FPU est nécessaire à l'appui sont tous définis dans la norme IEEE-754. Ces produire à l'intérieur de l'unité en virgule flottante, ce qui peut faire des choses différentes en fonction de la façon dont le float-point de commande de l'unité de drapeaux sont mis en place. Habituellement l'une des deux choses suivantes se produit:
1) L'exception est ignoré et le FPU définit un indicateur indiquant une erreur s'est produite dans son registre d'état(s).
2) L'exception n'est pas ignoré par la FPU, de sorte qu'au lieu d'une interruption est généré, et tout ce gestionnaire d'interruption a été mis en place pour les erreurs en virgule flottante est appelée. Habituellement, cela fait quelque chose de gentil pour vous, comme vous causer à briser cette ligne de code dans le débogueur ou de générer un fichier core.
Vous pouvez en savoir plus sur IEE-754 ici: http://www.openwatcom.org/ftp/devel/docs/ieee-754.pdf
Supplémentaire à virgule flottante références:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
http://floating-point-gui.de/
Selon
http://msdn.microsoft.com/en-us/library/aa289157%28v=vs.71%29.aspx#floapoint_topic8 ,
il semble possible de jeter les exceptions C++ dans MSVC
Créer les exceptions classes:
Carte C++ jeter à FPU exceptions structuré à l'aide de gestionnaire d'exception
Vous pouvez ensuite utiliser try catch
Le C++ runtime environment ne vous aidera pas la moindre ici. Vous aurez à effectuer ces vérifications vous-même, explicitement dans votre code. Sauf si bien sûr les fonctions que vous appelez sont à faire ces vérifications-auquel cas il dépend de la façon dont ils se comportent dans le cas d'une erreur.
Laissez-moi vous expliquer:
Devrait être en fait
Si le code qui échoue sur une division par zéro, et tel n'est pas le vôtre, alors vous aurez à creuser plus profond pour trouver ce qu'il a fait dans le cas d'une menace pour une erreur. Est-il jeter? Définir un indicateur? Demander à l'auteur et/ou de lire la source.
Voici un exemple d'une exception:
Jamais essayé, mais en supposant que diviser par zéro lève une exception, vous pouvez simplement placer le code dans un try/catch comme ceci:
essayer
{
//potentiel de division par zéro...
}
catch(...)
{
//... les captures de TOUTES les exceptions
}