Certaines fonctions mathématiques dans un programme que j'ai récemment écrit sont des valeurs inacceptables, telles que NAN (éventuellement pour ne pas vérifier les paramètres d'entrée de la fonction). Le problème est qu'il est difficile de suivre quelles fonctions transmettent les mauvaises valeurs. Cela se traduit par des erreurs en cours de propagation tout au long du code et rendant le programme Crimination des minutes ou des heures plus tard, le cas échéant. P>
Je me demande s'il y a un moyen d'attraper ces opérations défectueuses, une valeur NAN résulte de toute opération (à peu près la même chose que dans la "exception de la divisionbyzero" par certains compilateurs C / C ++, si je me souviens). p>
Merci d'avance. P>
P.D: N'hésitez pas à repousser ma question si nécessaire. P>
6 Réponses :
Sans voir votre code, cette réponse sera nécessairement vague, mais une façon de le faire consiste à vérifier la sortie de votre fonction et s'il s'agit de "Nan" soulever et exception:
if (double.IsNaN(result)) { throw new ArithmeticException(); }
Ce que je veux faire, c'est d'attraper où la valeur NAN est produite sans avoir à déboguer toute la demande et à écrire un chèque comme le vôtre sur chaque méthode qui accepte les doubles.
+1 C'est exactement ce que je cherchais, merci beaucoup pour la mise à jour :)
J'ai le même problème, mais la valeur qui me dérange n'est pas nan mais "infini". J'ai vérifié le système.Arithméticepxception comme décrit ci-dessus, mais cela ne tire pas, lorsque ma variole est définie sur "Infinity". Y a-t-il une autre exception pour vérifier l'option lancée?
@Aaginor - Vous voulez le double.Indifiity code>
méthode
Comme piège, je veux attraper lorsque la valeur infinie est produite, pour savoir où la pièce problématique de mon code est de pouvoir le réparer - sans qu'il soit nécessaire de passer à travers chaque ligne pour découvrir, où il se trouve.
Voulez-vous que vous recherchiez un paramètre ou une option de manière à ce que tout Je pense que la seule alternative au débogage à la main consiste à modifier le code de la manière dont le chrisf suggéré. Vous pouvez toujours mettre un int code> est attribué la valeur
nan code> vous voulez une exception à lancer? Je suis à peu près sûr qu'aucune telle chose n'existe. Il y a l'option
cochée code> qui vous avertira des débordements, mais ce n'est pas la même chose. p>
#if #if de débogage code> autour du lancer pour arrêter si je jette en code de production. P>
Oui, plus spécifiquement lorsque tout type de valeur, non seulement INT, est attribué à NAN.
Je ne sais pas si cela fonctionne sur le CLR, mais vous pouvez utiliser _ ControlFP_s de pour déclencher des exceptions de point flottant: à réinitialiser: p>
Vous avez lié la page d'aide CRT (The C Runtime Library) et en bas indique que cela ne s'applique pas à l'exécution .NET. OTOH, il convient de mentionner que vous pouvez utiliser p / invoke pour appeler la fonction C.
Je ne suis pas un utilisateur .NET, mais il semble raisonnable de supposer que c # utilise des instructions de point flottant normales, et cela devrait alors être attrapé. Si c # ne plaisante pas avec ces drapeaux, _em_invalid doit être déclenché pour NANS et si le masque est éteint, vous devez obtenir une exception FP.
Je sais aussi que ces exceptions sont désactivées par défaut dans les programmes VC ++, il pourrait donc valoir une prise de vue.
Merci, mais cela ne semble pas avoir d'effet pour moi.
Vous pouvez toujours essayer une pause conditionnelle lorsqu'il est en mode de débogage, vous trouverez le lien vers la réponse complète, car j'ai répondu à quelqu'un d'autre avec une question similaire: p>
Cela vous permettra de simplement mettre en pause l'exécution lorsque les conditions sont remplies, ce n'est peut-être pas une exception, mais il devrait vous aider néanmoins. P>
Cette question semble être un peu plus âgée, mais depuis que je suis tombé sur le même problème: La réponse de Alexander Torstling et les commentaires ci-dessous le travail bien pour moi.
Qu'est-ce qui est bien, c'est que même si c # ne fournit pas sa propre façon d'avoir permis à des exceptions ponctuelles flottantes, elle peut toujours les attraper (pour C ++, vous avez besoin d'une conversion en premier). p>
c # -code est ici: p> L'exception i get est {"Overflow ou sous-fleuve dans l'opération arithmétique."} System.Exception {Système .Arithmeticepxception} p> Je ne sais pas pourquoi le débogueur se plaint de la signature de _Control87; quiconque qui peut améliorer cela?
"Continuer" fonctionne bien pour moi, cependant. P> p>
Vous pouvez créer une classe qui définit les mêmes opérations qu'un INT (ou un double), qui enveloppe l'int (ou le double). Cette classe vérifierait la Nan après chaque opération (N.B. Ce sera beaucoup plus lent qu'un simple int ou double). p>
Dans votre code, vous utiliseriez ensuite cette nouvelle classe partout il y a un int (ou double, respectivement). Vous pouvez même utiliser un type de modèle Il peut y avoir des personnes qui n'aimeraient pas cette approche, mais je l'ai utilisée avec un succès décent pour certains problèmes (par exemple, en utilisant des calculs de haute précision uniquement sur des problèmes qui en ont besoin et en utilisant la précision de la machine autrement). P> Tintegertype code> dans votre code pour décider si vous souhaitez un INT ou votre classe
Safeint code>. P>
Il me semble que c'est un cas où l'intégration des tests dans le développement devrait être envisagée. Si vos fonctions mathématiques ne sont pas trop nombreuses, vous voudrez peut-être définir correctement les pré-postconditions et écrire des tests pour les éviter de renvoyer Nan en premier lieu.
Dans ce cas, accéder à un tableau où l'index = (long) nanvalue, mais cela aurait pu être autre chose.
@FRANK YEAH, c'est comme ça que j'aurais dû faire ça, mais je ne l'ai pas fait et c'est pourquoi je suis ici demandant :)