Éviter les floating point exceptions

Le
Marc Duflot
Bonjouor,

Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)

Plus précisément, je fais :

#include <signal.h>
#include <iostream>

int main()
{
double x1 = 1.0/0.0;
std::cout << "coucou 1 " << x1 << std::endl;
// des appels a la bibliotheque tierse
std::cout << "coucou 2 " << std::endl;
double x2 = 1.0/0.0;
std::cout << "coucou 3 " << std::endl;
std::cout << "coucou 4 " << x2 << std::endl;
}

et le résultat est
coucou 1 inf
coucou 2
floating point exception (core dumped)

J'ai essayé d'ajouter sigignore(SIGFPE) ou signal(SIGFPE, SIG_IGN) à
différents endroits mais ça ne change rien.

Si je fais

void blabla(int sig)
{
std::cout << "blabla " << sig << std::endl;
}

puis

signal (SIGFPE, blabla)

"blabla 8" s'affiche sans fin, ce qui prouve bien que c'est SIGFPE qui
est concerné. Si blabla est une fonction vide, cela boucle aussi sans fin.

Voyez-vous une méthode pour que cela fonctionne ?

Plateforme : linux, gcc. Je ne dispose pas des sources de la
bibliothèque tierse.


Merci,
Marc
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #20902511
Marc Duflot
Bonjouor,

Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)



Regarde le contenu de fenv.h, tu devrais y trouver ton bonheur.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Duflot
Le #20908721
Jean-Marc Bourguet wrote:
Marc Duflot
Bonjouor,

Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)



Regarde le contenu de fenv.h, tu devrais y trouver ton bonheur.



Merci beaucoup, Jean-Marc.

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :

#include <iostream>
#include #include
using namespace std;

void test_inf()
{
double x = 1.0 / 0.0;
cout << x << endl;
}

int main()
{
test_inf();
biblio_tierse_initializeAPI();
#ifdef _GNU_SOURCE
fedisableexcept(FE_ALL_EXCEPT);
#endif
test_inf();
}

Sans l'appel à fedisableexcept(FE_ALL_EXCEPT), le deuxième appel à
test_inf() cause une floating point exception.


Marc
Jean-Marc Bourguet
Le #20910671
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot
Bonjouor,

Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)



Regarde le contenu de fenv.h, tu devrais y trouver ton bonheur.



Merci beaucoup, Jean-Marc.

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :



fenv.h est C99 et POSIX et sauf erreur tu n'utilises ici que des choses
définies dans l'intersection des 2. L'applicabilité est plus large.

En C99, il y a aussi

#pragma STDC FENV_ACCESS ON

a mettre dans certaines conditions (je ne me souviens plus si c'est dès
qu'on touche à fenv ou uniquement si c'est quand on y touche de manière
indirecte). J'ai pas suivi comment cet aspect a été importé en C++0X.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Duflot
Le #20910971
Jean-Marc Bourguet wrote:
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot
Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)


Regarde le contenu de fenv.h, tu devrais y trouver ton bonheur.


Merci beaucoup, Jean-Marc.

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :



fenv.h est C99 et POSIX et sauf erreur tu n'utilises ici que des choses
définies dans l'intersection des 2. L'applicabilité est plus large.



Pourtant, selon cet extrait de la documention de la GNU libc :
http://www.gnu.org/software/libc/manual/html_node/Control-Functions.html
la fonction fedisableexcept est une extension GNU.

Merci encore.

Marc
Jean-Marc Bourguet
Le #20911151
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot
Dans une application, j'utilise beaucoup les valeurs infinies et Nan
comme valeurs spéciales pour certains doubles. Depuis que j'utilise une
bibliothèque tierse, cela ne fonctionne plus car j'ai l'erreur suivante:

floating point exception (core dumped)


Regarde le contenu de fenv.h, tu devrais y trouver ton bonheur.


Merci beaucoup, Jean-Marc.

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :



fenv.h est C99 et POSIX et sauf erreur tu n'utilises ici que des choses
définies dans l'intersection des 2. L'applicabilité est plus large.



Pourtant, selon cet extrait de la documention de la GNU libc :



Effectivement à première vue, ma mémoire a failli. J'ai malheureusement
pas le temps de chercher la source de la confusion.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc
Le #20911401
Marc Duflot wrote:

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :


[...]
fedisableexcept(FE_ALL_EXCEPT);



feholdexcept ne conviendrait pas ici ?
Marc Duflot
Le #20911741
Marc wrote:
Marc Duflot wrote:

Pour les archives, voici la solution que j'ai trouvée, qui ne fonctionne
probablement que avec GNU libc :


[...]
fedisableexcept(FE_ALL_EXCEPT);



feholdexcept ne conviendrait pas ici ?



En effet, merci. Cette solution est préférable car feholdexcept est
standard, et non une extension GNU.

Voici un exemple complet pour les archives :

#include <iostream>
#include #include
using namespace std;

void test_inf()
{
double x = 1.0 / 0.0;
cout << x << endl;
}

int main()
{
test_inf();
biblio_tierse_initializeAPI();
fenv_t envp;
fegetenv(&envp);
feholdexcept(&envp);
test_inf();
}
Publicité
Poster une réponse
Anonyme