math_error(7) Miscellaneous Information Manual math_error(7) NOM math_error - Detecter des erreurs des fonctions mathematiques SYNOPSIS #include #include #include DESCRIPTION Quand une erreur se produit, la plupart des fonctions de bibliotheques l'indiquent en renvoyant une valeur speciale (par exemple, -1 ou NULL). Parce qu'elles renvoient en general un nombre en virgule flottante, les fonctions mathematiques declarees dans indiquent une erreur en utilisant d'autres mecanismes. Il y a deux mecanismes d'indication d'erreur : l'ancien configure errno ; le nouveau utilise le mecanisme d'exception de virgule flottante (l'utilisation de feclearexcept(3) et fetestexcept(3), comme explicite ci-dessous) decrit dans fenv(3). Un programme portable qui doit verifier les erreurs d'une fonction mathematique devrait mettre errno a zero et effectuer l'appel suivant : feclearexcept(FE_ALL_EXCEPT); avant d'appeler une fonction mathematique. Apres le retour d'une fonction mathematique, si errno est non nul ou si l'appel suivant (consultez fenv(3)) ne renvoie pas zero : fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); alors une erreur s'est produite dans la fonction mathematique. Les conditions d'erreur qui peuvent se produire pour les fonctions mathematiques sont decrites ci-dessous. Erreur de domaine Une erreur de domaine se produit quand une fonction mathematique recoit un parametre dont la valeur se trouve en dehors du domaine de definition de la fonction (par exemple, fournir un parametre negatif a log(3)). Lorsqu'une erreur de domaine se produit, les fonctions renvoient generalement un NaN (mais certaines fonctions renvoient une valeur differente dans ce cas) ; errno prend la valeur EDOM et une exception de virgule flottante << incorrecte >> (FE_INVALID) est levee. Erreur de pole Une erreur de pole se produit quand le resultat mathematique d'une fonction est un infini (par exemple, le logarithme de 0 est l'infini negatif). Quand une erreur de pole se produit, la fonction renvoie la valeur (signee) 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 resultat est celui du resultat correct de la fonction mathematique. errno prend la valeur ERANGE et une exception de virgule flottante de division par zero (FE_DIVBYZERO) est levee. Erreur d'intervalle Une erreur d'intervalle se produit quand le module du resultat de la fonction ne peut pas etre represente par le type utilise pour le resultat de la fonction. La valeur de retour de la fonction depend suivant qu'il s'agit d'un depassement (<< overflow >>) ou d'un soupassement (<< underflow >>). Un depassement se produit pour le resultat flottant si le resultat est fini, mais trop grand pour etre represente dans le type du resultat. Quand un depassement se produit, la fonction renvoie la valeur HUGE_VAL, HUGE_VALF ou HUGE_VALL, suivant que le type de retour de la fonction est un double, un float ou un long double. errno prend la valeur ERANGE et une exception de virgule flottante de depassement (FE_OVERFLOW) est levee. Un soupassement se produit pour le resultat flottant si le resultat est trop petit pour etre represente dans le type du resultat. Quand un soupassement se produit, une fonction mathematique renvoie generalement 0,0 (C99 indique qu'une fonction doit renvoyer << une valeur propre a l'implementation dont le module n'est pas plus grand que la plus petite valeur normalisee positive du type donne >>). errno prend la valeur ERANGE et une exception de virgule flottante de << soupassement >> (FE_UNDERFLOW) peut etre levee. Certaines fonctions produisent une erreur d'intervalle si la valeur du parametre fourni, ou le resultat exact de la fonction, est denormalise (<< subnormal >>). Une valeur denormalisee est une valeur qui n'est pas nulle, mais dont le module est si petit qu'il ne peut etre represente dans la forme normalisee (c'est-a-dire avec un 1 dans le bit de poids fort de la mantisse). La representation d'un nombre denormalise contiendra un ou plusieurs zeros en tete de la mantisse. NOTES L'identifiant math_errhandling specifie par C99 et POSIX.1 n'est pas pris en charge par la glibc. Cet identifiant est suppose indiquer lequel des deux mecanismes d'indication d'erreur est utilise (errno ou des exceptions recuperables avec fettestexcept(3)). Les normes imposent qu'au moins l'un d'entre eux soit utilise, mais autorisent a ce que les deux soient disponibles. La situation actuelle de la glibc (version 2.8) n'est pas tres propre. La plupart des fonctions (mais pas toutes) levent des exceptions en cas d'erreur. Certaines positionnent egalement errno. Quelques fonctions positionnent errno, mais ne levent pas d'exception. Tres peu ne font ni l'un ni l'autre. Consultez les differentes pages de manuel pour avoir les details. Pour eviter la complexite d'avoir a utiliser errno et fetestexcept(3) pour la detection d'erreurs, il est souvent recommande de verifier la validite des parametres avant les appels. Par exemple, le code suivant s'assure que le parametre de log(3) n'est ni un NaN, ni zero (une erreur de pole) ou inferieur a zero (une erreur de domaine) : double x, r; if (isnan(x) || islessequal(x, 0)) { /* Traite un NaN / erreur de pole / erreur de domaine */ } r = log(x); La discussion sur cette page ne s'applique pas aux fonctions mathematiques a variables complexes (c'est-a-dire celles declarees par ), pour lesquelles C99 et POSIX.1 n'exigent pas en general de renvoyer d'erreurs. L'option de gcc(1) -fno-math-errno permet d'utiliser des implementations de certaines fonctions mathematiques plus rapides que les implementations standard, mais qui ne positionnent pas errno (l'option -ffast-math de gcc(1) active egalement -fno-math-errno). Une erreur peut toujours etre testee en utilisant fetestexcept(3). VOIR AUSSI gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3) info libc TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.8 2 mai 2024 math_error(7)