#include <math.h> [[obsolète]] int matherr(struct exception *exc); [[obsolète]] extern _LIB_VERSION_TYPE _LIB_VERSION;
La spécification « System V Interface Definition » (SVID) spécifie que différentes fonctions mathématiques devraient appeler une fonction matherr() 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 matherr(), le système retourne dans la fonction mathématique qui renvoie le résultat à l'appelant.
Pour utiliser matherr(), le programmeur doit définir la macro de test de fonctionnalité _SVID_SOURCE (avant d'inclure tout fichier d'en-tête) et définir la variable externe _LIB_VERSION à la valeur _SVID_.
Le système fournit une version par défaut de matherr(). Cette version ne fait rien et renvoie zéro (voir ci-dessous pour la signification). La fonction matherr() 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 exception, défini comme ceci :
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; /* 2ème paramètre de la fonction */
double retval; /* Valeur renvoyée par la fonction */
}
Le champ type peut prendre une des valeurs suivantes :
Les champs arg1 et arg2 sont les paramètres fournis à la fonction (arg2 n'est pas défini pour les fonctions qui ne prennent qu'un seul paramètre).
Le champ retval spécifie la valeur que la fonction mathématique va renvoyer à l'appelant. La fonction matherr() définie par le programmeur peut modifier ce champ pour changer la valeur renvoyée par la fonction mathématique.
Si la fonction matherr() renvoie zéro, alors le système positionne errno comme décrit ci-dessus et peut afficher un message d'erreur sur la sortie d'erreur standard (voir ci-dessous).
Si la fonction matherr() renvoie une valeur non nulle, alors le système ne positionne pas errno et n'affiche pas de message d'erreur.
Les colonnes « Msg? » et « errno » décrivent le comportement par défaut si matherr() renvoie zéro. Si la colonne « Msg? » contient « o », alors le système affiche un message d'erreur sur la sortie d'erreur standard.
La table utilise les notations et abréviations suivantes :
| x premier paramètre de la fonction | |
| y second paramètre de la fonction | |
| fin valeur finie du paramètre | |
| neg valeur négative du paramètre | |
| int valeur entière du paramètre | |
| o/f dépassement du résultat | |
| u/f soupassement du résultat | |
| |x| valeur absolue de x | |
| X_TLOSS est une constante définie dans <math.h> |
| Fonction | Type | Résultat | Msg ? | errno |
| acos(|x|>1) | DOMAIN | HUGE | y | EDOM |
| asin(|x|>1) | DOMAIN | HUGE | y | EDOM |
| atan2(0,0) | DOMAIN | HUGE | y | EDOM |
| acosh(x<1) | DOMAIN | NAN | y | EDOM |
| atanh(|x|>1) | DOMAIN | NAN | y | EDOM |
| atanh(|x|==1) | SING | (x>0.0)? | y | 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 | y | 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 | y | ERANGE |
| j1(|x|>X_TLOSS) | TLOSS | 0.0 | y | ERANGE |
| jn(|x|>X_TLOSS) | TLOSS | 0.0 | y | ERANGE |
| y0(x>X_TLOSS) | TLOSS | 0.0 | y | ERANGE |
| y1(x>X_TLOSS) | TLOSS | 0.0 | y | ERANGE |
| yn(x>X_TLOSS) | TLOSS | 0.0 | y | ERANGE |
| y0(0) | DOMAIN | -HUGE | y | EDOM |
| y0(x<0) | DOMAIN | -HUGE | y | EDOM |
| y1(0) | DOMAIN | -HUGE | y | EDOM |
| y1(x<0) | DOMAIN | -HUGE | y | EDOM |
| yn(n,0) | DOMAIN | -HUGE | y | EDOM |
| yn(x<0) | DOMAIN | -HUGE | y | EDOM |
| lgamma(fin) o/f | OVERFLOW | HUGE | n | ERANGE |
| lgamma(-int) ou | SING | HUGE | y | EDOM |
| lgamma(0) | ||||
| tgamma(fin) o/f | OVERFLOW | HUGE_VAL | n | ERANGE |
| tgamma(-int) | SING | NAN | y | EDOM |
| tgamma(0) | SING | copysign( | y | ERANGE |
| HUGE_VAL,x) | ||||
| log(0) | SING | -HUGE | y | EDOM |
| log(x<0) | DOMAIN | -HUGE | y | EDOM |
| log2(0) | SING | -HUGE | n | EDOM |
| log2(x<0) | DOMAIN | -HUGE | n | EDOM |
| log10(0) | SING | -HUGE | y | EDOM |
| log10(x<0) | DOMAIN | -HUGE | y | EDOM |
| pow(0.0,0.0) | DOMAIN | 0.0 | y | 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**neg | DOMAIN | 0.0 | y | EDOM |
| neg**non-int | DOMAIN | 0.0 | y | 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 | y | EDOM |
| remainder(x,0) | DOMAIN | NAN | y | EDOM |
| Interface | Attribut | Valeur |
| matherr() | Sécurité des threads | MT-Safe |
L'exécution suivante de l'exemple (dans laquelle log(3) reçoit la valeur 0.0) n'utilise pas matherr() :
$ ./a.out 0.0 errno: Numerical result out of range x=-inf
Dans l'exécution suivante, matherr() est appelée et renvoie 0 :
$ ./a.out 0.0 0
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
Le message « log: SING error » a été affiché par la bibliothèque C.
Dans l'exécution suivante, matherr() est appelée et renvoie une valeur non nulle :
$ ./a.out 0.0 1
matherr SING exception in log() function
args: 0.000000, 0.000000
retval: -340282346638528859811704183484516925440.000000
x=-340282346638528859811704183484516925440.000000
Dans ce cas, la bibliothèque C n'a pas affiché de message et errno n'a pas été positionnée.
Dans l'exécution suivante, matherr() est appelée, modifie la valeur renvoyée par la fonction mathématique et renvoie une valeur non nulle :
$ ./a.out 0.0 1 12345.0
matherr SING exception in log() function
args: 0.000000, 0.000000
retval: -340282346638528859811704183484516925440.000000
x=12345.000000
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à