Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Éviter les floating point exceptions

7 réponses
Avatar
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

7 réponses

Avatar
Jean-Marc Bourguet
Marc Duflot writes:

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
Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot writes:

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 <fenv.h>
#include <biblio_tierse_API.h>

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
Avatar
Jean-Marc Bourguet
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

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
Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

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
Avatar
Jean-Marc Bourguet
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

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
Avatar
Marc
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 ?
Avatar
Marc Duflot
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 <fenv.h>
#include <biblio_tierse_API.h>

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();
}