table of contents
MATH_ERROR(7) | Manuel du programmeur Linux | MATH_ERROR(7) |
NOM¶
math_error - Détecter des erreurs des fonctions mathématiquesSYNOPSIS¶
#include <math.h> #include <errno.h> #include <fenv.h>
DESCRIPTION¶
Quand une erreur se produit, la plupart des fonctions de bibliothèques l'indiquent en renvoyant une valeur spéciale (par exemple, -1 ou NULL). Parce qu'elles renvoient en général un nombre en virgule flottante, les fonctions mathématiques déclarées dans <math.h> indiquent une erreur en utilisant d'autres mécanismes. Il y a deux mécanismes d'indication d'erreur : l'ancien configure errno ; le nouveau utilise le mécanisme d'exception de virgule flottante (l'utilisation de feclearexcept(3) et fetestexcept(3), comme explicité ci-dessous) décrit dans fenv(3).feclearexcept(FE_ALL_EXCEPT);
avant d'appeler une fonction mathématique.
fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW);
alors une erreur s'est produite dans la fonction mathématique.
Erreur de domaine¶
Une erreur de domaine se produit quand une fonction mathématique reçoit un paramètre dont la valeur se trouve en dehors du domaine de définition de la fonction (par exemple, fournir un paramètre négatif à log(3)). Lorsqu'une erreur de domaine se produit, les fonctions renvoient généralement un NaN (mais certaines fonctions renvoient une valeur différente dans ce cas) ; errno prend la valeur EDOM et une exception de virgule flottante « incorrecte » ( FE_INVALID) est levée.Erreur de pôle¶
Une erreur de pôle se produit quand le résultat mathématique d'une fonction est un infini (par exemple, le logarithme de 0 est l'infini négatif). Quand une erreur de pôle se produit, la fonction renvoie la valeur (signée) HUGE_VAL, HUGE_VALF ou HUGE_VALL suivant que la valeur de retour de la fonction est un double, un float ou un long double. Le signe du résultat est celui du résultat correct de la fonction mathématique. errno prend la valeur ERANGE et une exception de virgule flottante de division par zéro ( FE_DIVBYZERO) est levée.Erreur d'intervalle¶
Une erreur d'intervalle se produit quand le module du résultat de la fonction ne peut pas être représenté par le type utilisé pour le résultat de la fonction. La valeur de retour de la fonction dépend suivant qu'il s'agit d'un dépassement (« overflow ») ou d'un soupassement (« underflow »).NOTES¶
L'identifiant math_errhandling spécifié par C99 et POSIX.1-2001 n'est pas pris en charge par la glibc. Cet identifiant est supposé indiquer lequel des deux mécanismes d'indication d'erreur est utilisé ( errno ou des exceptions récupérables avec fettestexcept(3)). Les normes imposent qu'au moins l'un d'entre eux soit utilisé, mais autorisent à ce que les deux soient disponibles. La situation actuelle de la glibc (version 2.8) n'est pas très propre. La plupart des fonctions (mais pas toutes) lèvent des exceptions en cas d'erreur. Certaines positionnent également errno. Quelques fonctions positionnent errno, mais ne lèvent pas d'exception. Très peu ne font ni l'un ni l'autre. Consultez les différentes pages de manuel pour avoir les détails.double x, r; if (isnan(x) || islessequal(x, 0)) { /* Deal with NaN / pole error / domain error */ } r = log(x);
La discussion sur cette page ne s'applique pas aux fonctions mathématiques à variables complexes (c'est-à-dire celles déclarées par <complex.h>), pour lesquelles C99 et POSIX.1-2001 n'exigent pas en général de renvoyer d'erreurs.
VOIR AUSSI¶
gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3)COLOPHON¶
Cette page fait partie de la publication 3.44 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse <http://www.kernel.org/doc/man-pages/>.TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>. Alain Portal <http://manpagesfr.free.fr/> (2008). Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le paquet manpages-fr. Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C <section> <page_de_man> ».11 août 2008 | Linux |