.\" t .\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MATHERR 3 "10 septembre 2010" Linux "Manuel du programmeur Linux" .SH NOM matherr \- Gestionnaire d'exception SVID de la bibliothèque mathématique .SH SYNOPSIS .nf \fB#define _SVID_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP \fBint matherr(struct exception *\fP\fIexc\fP\fB);\fP \fBextern _LIB_VERSION_TYPE _LIB_VERSION;\fP .fi .sp Effectuez l'édition des liens avec l'option \fI\-lm\fP. .SH DESCRIPTION La spécification «\ System V Interface Definition\ » (SVID) spécifie que différentes fonctions devraient appeler une fonction \fBmatherr\fP() en cas d'exception mathématique. Cette fonction est appelée avant que la fonction mathématique ne rende la main\ ; après le retour de \fBmatherr\fP(), le système retourne dans la fonction mathématique qui renvoie le résultat à l'appelant. Le mécanisme \fBmatherr\fP() est pris en charge par la glibc, mais il est désormais obsolète\ : les nouvelles applications devraient utiliser les techniques décrites dans \fBmath_error\fP(7) et \fBfenv\fP(3). Cette page documente le mécanisme \fBmatherr\fP() de la glibc comme aide pour maintenir et porter d'anciennes applications. Pour utiliser \fBmatherr\fP(), le programmeur doit définir la macro de test de fonctionnalité \fB_SVID_SOURCE\fP (avant d'inclure \fItout\fP en\-tête) et définir la variable externe \fB_LIB_VERSION\fP à la valeur \fB_SVID_\fP. Le système fourni une version par défaut de \fBmatherr\fP(). Cette version ne fait rien et renvoie zéro (voir ci\-dessous pour la signification). La fonction \fBmatherr\fP() par défaut peut être remplacée par une version spécifique au programme, qui sera appelée quand une exception se produit. La fonction est appelée avec un paramètre, un pointeur vers une structure \fIexception\fP, définie comme ceci\ : .in +4n .nf struct exception { int type; /* Type d'exception */ char *name; /* Nom de la fonction ayant produit l'exception */ double arg1; /* 1er paramètre de la fonction */ double arg2; /* 2e paramètre de la fonction */ double retval; /* Valeur de retour de la fonction */ } .fi .in .PP Le champ \fItype\fP peut prendre une des valeurs suivantes\ : .TP 12 \fBDOMAIN\fP Une erreur de domaine s'est produite (un paramètre de la fonction était en dehors du domaine de définition de la fonction). La valeur de retour dépend de la fonction\ ; \fIerrno\fP prend la valeur \fBEDOM\fP. .TP \fBSING\fP Une erreur de pôle s'est produite (la fonction résulte en un infini). La valeur de retour dans la plupart des cas est \fBHUGE\fP (le plus grand nombre en virgule flottante), avec le bon signe. Dans la plupart des cas, \fIerrno\fP prend la valeur \fBEDOM\fP. .TP \fBOVERFLOW\fP Un dépassement s'est produit. Dans la plupart des cas, la valeur \fBHUGE\fP est renvoyée et \fIerrno\fP prend la valeur \fBERANGE\fP. .TP \fBUNDERFLOW\fP Un soupassement («\ underflow\ ») s'est produit. 0,0 est renvoyé et \fIerrno\fP prend la valeur \fBERANGE\fP. .TP \fBTLOSS\fP Perte complète de chiffres significatifs. 0,0 est renvoyé et \fIerrno\fP prend la valeur \fBERANGE\fP. .TP \fBPLOSS\fP Perte partielle de chiffres significatifs. La valeur n'est pas utilisée par la glibc (et beaucoup d'autres systèmes). .PP Les champs \fIarg1\fP et \fIarg2\fP sont les paramètres fournis à la fonction (\fIarg2\fP n'est pas défini pour les fonctions qui ne prennent qu'un seul paramètre). Le champ \fIretval\fP spécifie la valeur de retour que la fonction mathématique va renvoyer à l'appelant. La fonction \fBmatherr\fP() spécifique au programme peut modifier ce champ pour changer la valeur de retour de la fonction mathématique. Si la fonction \fBmatherr\fP() renvoie zéro, alors le système positionne \fIerrno\fP comme décrit ci\-dessus et peut afficher un message d'erreur sur la sortie d'erreur (voir ci\-dessous). Si la fonction \fBmatherr\fP() renvoie une valeur non nulle, alors le système ne positionne pas \fIerrno\fP et n'affiche pas de message d'erreur. .SS "Fonctions mathématiques qui utilisent matherr()" La table ci\-dessous liste les fonctions et les circonstances pour lesquelles \fBmatherr\fP() est appelée. La colonne «\ Type\ » indique la valeur donnée à \fIexc\->type\fP lors de l'appel à \fBmatherr\fP(). La colonne «\ Résultat\ » est la valeur du résultat par défaut donnée à \fIexc\->retval\fP. Les colonnes «\ Msg?\ » et «\ errno\ » décrivent le comportement par défaut si \fBmatherr\fP() renvoie zéro. Si la colonne «\ Msg?\ » contient «\ o\ », alors le système affiche un message d'erreur sur la sortie d'erreur. La table utilise les notations et abréviations suivantes\ : .RS .nf x premier paramètre de la fonction y deuxième paramètre de la fonction fin valeur finie du paramètre nég valeur négative du paramètre ent valeur entière du paramètre o/f dépassement («\ overflow\ ») pour le résultat u/f soupassement («\ underflow\ ») pour le résultat |x| valeur absolue de x X_TLOSS constante définie dans \fI\fP .fi .RE .\" Details below from glibc 2.8's sysdeps/ieee754/k_standard.c .\" A subset of cases were test by experimental programs. .TS lB lB lB cB lB l l l c l. Fonction Type Résultat Msg? errno acos(|x|>1) DOMAIN HUGE o EDOM asin(|x|>1) DOMAIN HUGE o EDOM atan2(0,0) DOMAIN HUGE o EDOM .\" retval is 0.0/0.0 acosh(x<1) DOMAIN NAN o EDOM .\" retval is 0.0/0.0 atanh(|x|>1) DOMAIN NAN o EDOM .\" retval is x/0.0 atanh(|x|==1) SING (x>0.0)? o EDOM \ \ HUGE_VAL : \ \ \-HUGE_VAL cosh(fin) o/f OVERFLOW HUGE n ERANGE sinh(fin) o/f OVERFLOW (x>0.0) ? n ERANGE \ \ HUGE : \-HUGE sqrt(x<0) DOMAIN 0.0 o EDOM hypot(fin,fin) o/f OVERFLOW HUGE n ERANGE exp(fin) o/f OVERFLOW HUGE n ERANGE exp(fin) u/f UNDERFLOW 0.0 n ERANGE exp2(fin) o/f OVERFLOW HUGE n ERANGE exp2(fin) u/f UNDERFLOW 0.0 n ERANGE exp10(fin) o/f OVERFLOW HUGE n ERANGE exp10(fin) u/f UNDERFLOW 0.0 n ERANGE j0(|x|>X_TLOSS) TLOSS 0.0 o ERANGE j1(|x|>X_TLOSS) TLOSS 0.0 o ERANGE jn(|x|>X_TLOSS) TLOSS 0.0 o ERANGE y0(x>X_TLOSS) TLOSS 0.0 o ERANGE y1(x>X_TLOSS) TLOSS 0.0 o ERANGE yn(x>X_TLOSS) TLOSS 0.0 o ERANGE y0(0) DOMAIN \-HUGE o EDOM y0(x<0) DOMAIN \-HUGE o EDOM y1(0) DOMAIN \-HUGE o EDOM y1(x<0) DOMAIN \-HUGE o EDOM yn(n,0) DOMAIN \-HUGE o EDOM yn(x<0) DOMAIN \-HUGE o EDOM lgamma(fin) o/f OVERFLOW HUGE n ERANGE lgamma(\-ent) or SING HUGE o EDOM \ \ lgamma(0) tgamma(fin) o/f OVERFLOW HUGE_VAL n ERANGE tgamma(\-ent) SING NAN o EDOM tgamma(0) SING copysign( o ERANGE \ \ HUGE_VAL,x) log(0) SING \-HUGE o EDOM log(x<0) DOMAIN \-HUGE o EDOM .\" different from log() log2(0) SING \-HUGE n EDOM .\" different from log() log2(x<0) DOMAIN \-HUGE n EDOM log10(0) SING \-HUGE o EDOM log10(x<0) DOMAIN \-HUGE o EDOM pow(0.0,0.0) DOMAIN 0.0 o EDOM pow(x,y) o/f OVERFLOW HUGE n ERANGE pow(x,y) u/f UNDERFLOW 0.0 n ERANGE pow(NaN,0.0) DOMAIN x n EDOM .\" +0 and -0 0**nég DOMAIN 0.0 o EDOM nég**non\-ent DOMAIN 0.0 o EDOM scalb() o/f OVERFLOW (x>0.0) ? n ERANGE \ \ HUGE_VAL : \ \ \-HUGE_VAL scalb() u/f UNDERFLOW copysign( n ERANGE \ \ \ \ 0.0,x) fmod(x,0) DOMAIN x o EDOM .\" retval is 0.0/0.0 remainder(x,0) DOMAIN NAN o EDOM .TE .SH EXEMPLE Le programme d'exemple montre l'utilisation de \fBmatherr\fP() lors de l'appel à \fBlog\fP(3). Le programme prend jusqu'à 3 paramètres en ligne de commande. Le premier paramètre est le nombre en virgule flottante à fournir à \fBlog\fP(3). Si le deuxième paramètre, optionnel, est fourni, \fB_LIB_VERSION\fP est configuré à la valeur \fB_SVID_\fP de telle sorte que \fBmatherr\fP() soit appelée et l'entier fourni sur la ligne de commande est utilisé comme valeur de retour de \fBmatherr\fP(). Si le troisième paramètre, optionnel, est fourni, il spécifie une autre valeur de retour que \fBmatherr\fP() doit positionner comme valeur de retour de la fonction mathématique. L'exécution suivante de l'exemple (dans laquelle \fBlog\fP(3) reçoit la valeur 0,0) n'utilise pas \fBmatherr\fP()\ : .in +4n .nf $\fB ./a.out 0.0\fP errno: Numerical result out of range x=\-inf .fi .in Dans l'exécution suivante, \fBmatherr\fP() est appelée et renvoie 0\ : .in +4n .nf $\fB ./a.out 0.0 0\fP matherr SING exception in log() function args: 0.000000, 0.000000 retval: \-340282346638528859811704183484516925440.000000 log: SING error errno: Numerical argument out of domain x=\-340282346638528859811704183484516925440.000000 .fi .in Le message «\ log: SING error\ » a été affiché par la bibliothèque C. Dans l'exécution suivante, \fBmatherr\fP() est appelée et renvoie une valeur non nulle\ : .in +4n .nf $\fB ./a.out 0.0 1\fP matherr SING exception in log() function args: 0.000000, 0.000000 retval: \-340282346638528859811704183484516925440.000000 x=\-340282346638528859811704183484516925440.000000 .fi .in Dans ce cas, la bibliothèque C n'a pas affiché de message et \fIerrno\fP n'a pas été positionnée. Dans l'exécution suivante, \fBmatherr\fP() est appelée, modifie la valeur de retour de la fonction mathématique et renvoie une valeur non nulle\ : .in +4n .nf $\fB ./a.out 0.0 1 12345.0\fP matherr SING exception in log() function args: 0.000000, 0.000000 retval: \-340282346638528859811704183484516925440.000000 x=12345.000000 .fi .in .SS "Source du programme" \& .nf #define _SVID_SOURCE #include #include #include #include static int matherr_ret = 0; /* Value that matherr() should return */ static int change_retval = 0; /* Should matherr() change function\(aqs return value? */ static double new_retval; /* New function return value */ int matherr(struct exception *exc) { fprintf(stderr, "matherr %s exception in %s() function\en", (exc\->type == DOMAIN) ? "DOMAIN" : (exc\->type == OVERFLOW) ? "OVERFLOW" : (exc\->type == UNDERFLOW) ? "UNDERFLOW" : (exc\->type == SING) ? "SING" : (exc\->type == TLOSS) ? "TLOSS" : (exc\->type == PLOSS) ? "PLOSS" : "???", exc\->name); fprintf(stderr, " args: %f, %f\en", exc\->arg1, exc\->arg2); fprintf(stderr, " retval: %f\en", exc\->retval); if (change_retval) exc\->retval = new_retval; return matherr_ret; } int main(int argc, char *argv[]) { double x; if (argc < 2) { fprintf(stderr, "Usage: %s " " [ []]\en", argv[0]); exit(EXIT_FAILURE); } if (argc > 2) { _LIB_VERSION = _SVID_; matherr_ret = atoi(argv[2]); } if (argc > 3) { change_retval = 1; new_retval = atof(argv[3]); } x = log(atof(argv[1])); if (errno != 0) perror("errno"); printf("x=%f\en", x); exit(EXIT_SUCCESS); } .fi .SH "VOIR AUSSI" \fBfenv\fP(3), \fBmath_error\fP(7), \fBstandards\fP(7) .SH COLOPHON Cette page fait partie de la publication 3.65 du projet \fIman\-pages\fP 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/. .SH TRADUCTION Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a par l'équipe de traduction francophone au sein du projet perkamon . .PP Alain Portal \ (2008). .PP Veuillez signaler toute erreur de traduction en écrivant à ou par un rapport de bogue sur le paquet \fBmanpages\-fr\fR. .PP Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande «\ \fBman\ \-L C\fR \fI
\fR\ \fI\fR\ ».