Division par zéro ne jette pas SIGFPE

J’ai un petit programme effectuant la division en virgule flottante par zéro, donc j’attends SIGFPE.

#include  #include  #include  #include  #include  void signal_handler (int signo) { if(signo == SIGFPE) { std::cout << "Caught FPE\n"; } } int main (void) { signal(SIGFPE,(*signal_handler)); double b = 1.0; double c = 0.0; double d = b/c; std::cout << "d = "<< d << std::endl; return 0; } 

En fait, j’ai la sortie suivante:

 d = inf 

gcc version 4.5.2 (Ubuntu / Linaro 4.5.2-8ubuntu4)

Que dois-je faire pour lancer SIGFPE dans ce cas? De quels facteurs dépend le comportement des opérations de FP (indicateurs de compilation / type de CPU, etc.)?

Merci

Pour les nombres à virgule flottante, vous pouvez modifier ce comportement en configurant le mot de contrôle FPU. Regardez ici

Vous n’obtenez un signal que si vous effectuez une division entière par zéro. Pour les nombres en virgule flottante, la division par zéro est bien définie.

Ceci est en fait assez bien expliqué dans l’article de Wikipedia .

Vous ne recevez pas de signal, car le comportement par défaut sur la plupart des ordinateurs consiste à polluer vos données avec des NaNs (pas un nombre) et des infinis. Vous devez activer les exceptions en virgule flottante, et la façon dont vous le faites est spécifique à la machine. Regardez l’en-tête du système fenv.h , si vous en avez un. La fonction fesettrapenable permet de capturer des exceptions en virgule flottante sur de nombreuses machines.

Malheureusement, il n’existe pas de fonction standard permettant d’activer la gestion des exceptions en virgule flottante.