Question

Il est souvent difficile de trouver l’origine d’un NaN, car il peut se produire à n’importe quelle étape d’un calcul et se propager. Alors, est-il possible de suspendre un programme C ++ lorsqu'un calcul renvoie NaN ou inf? Le mieux à mon avis serait d’avoir un crash avec un joli message d’erreur:

Foo: NaN encoutered at Foo.c:624

Est-ce que quelque chose comme ça est possible? Avez-vous une meilleure solution? Comment déboguer les problèmes de NaN?

EDIT: Précisions: je travaille avec GCC sous Linux.

Était-ce utile?

La solution

Vous ne pouvez pas le faire de manière totalement portable, mais de nombreuses plates-formes fournissent des API C qui vous permettent d'accéder au (x) registre (s) de contrôle d'état en virgule flottante.

Plus précisément, vous souhaitez démasquer les exceptions de dépassement de capacité et de virgule flottante non valides, ce qui obligera le processeur à signaler une exception lorsque l'arithmétique de votre programme produit un résultat NaN ou infini.

Sur votre système Linux, cela devrait faire l'affaire:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

Vous voudrez peut-être apprendre à écrire un gestionnaire d'interruptions afin de pouvoir imprimer un message de diagnostic ou continuer de toute façon l'exécution si l'une de ces exceptions est signalée.

Autres conseils

Oui! Définissez (peut-être de manière plus ou moins portable) votre processeur conforme à IEEE 754 pour générer une interruption si vous rencontrez un problème NaN ou infini.

J'ai cherché sur Google et trouvé ces diapositives , qui sont un début. La diapositive de la page 5 résume toutes les informations dont vous avez besoin.

Je ne suis pas un expert en C, mais je m'attends à ce que la réponse soit non.

  1. Ceci nécessiterait que tous les calculs flottants aient cette vérification. Un impact énorme sur les performances.
  2. NaN et Inf ne sont pas méchants. Elles peuvent être légitimement utilisées dans certaines bibliothèques que votre application utilise et casser le.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top