Man page - matherr(3)

Packages contains this manual

Available languages:

en fr ja ru

Manual

matherr

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Fonctions mathématiques qui utilisent matherr()
ATTRIBUTS
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

matherr — Gestionnaire d’exception SVID de la bibliothĂšque mathĂ©matique

BIBLIOTHÈQUE

BibliothĂšque de math ( libm , -lm )

SYNOPSIS

#include <math.h>

[[obsolĂšte]] int matherr(struct exception * exc );

[[obsolĂšte]] extern _LIB_VERSION_TYPE _LIB_VERSION;

DESCRIPTION

Note : Le mĂ©canisme dĂ©crit dans cette page n’est plus pris en charge par la glibc. Avant la glibc 2.27, il a Ă©tĂ© marquĂ© comme obsolĂšte. Depuis la glibc 2.27, il a Ă©tĂ© complĂštement supprimĂ©. Les nouvelles applications devraient utiliser les techniques dĂ©crites dans math_error (7) et fenv (3). Cette page documente le mĂ©canisme matherr () de la glibc comme aide pour maintenir et porter d’anciennes applications.

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 :

DOMAIN

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 renvoyĂ©e dĂ©pend de la fonction ; errno prend la valeur EDOM .

SING

Une erreur de pĂŽle s’est produite (le rĂ©sultat de la fonction est un infini). La valeur renvoyĂ©e dans la plupart des cas est HUGE (le plus grand nombre en virgule flottante simple prĂ©cision), avec le bon signe. Dans la plupart des cas, errno prend la valeur EDOM .

OVERFLOW

Un dĂ©passement s’est produit. Dans la plupart des cas, la valeur HUGE est renvoyĂ©e et errno prend la valeur ERANGE .

UNDERFLOW

Un soupassement (« underflow ») s’est produit. 0.0 est renvoyĂ© et errno prend la valeur ERANGE .

TLOSS

Perte complÚte de chiffres significatifs. 0,0 est renvoyé et errno prend la valeur ERANGE .

PLOSS

Perte partielle de chiffres significatifs. La valeur n’est pas utilisĂ©e par la glibc (et beaucoup d’autres systĂšmes).

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.

Fonctions mathématiques qui utilisent matherr()

La table ci-dessous liste les fonctions et les circonstances pour lesquelles matherr () est appelĂ©e. La colonne « Type » indique la valeur donnĂ©e Ă  exc->type lors de l’appel Ă  matherr (). La colonne « RĂ©sultat » est la valeur du rĂ©sultat par dĂ©faut donnĂ©e Ă  exc->retval .

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 :

Image grohtml-3865779-1.png

Image grohtml-3865779-2.png

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3865779-3.png

EXEMPLES

Le programme d’exemple montre l’utilisation de matherr () lors de l’appel Ă  log (3). Le programme prend jusqu’à 3 paramĂštres en ligne de commande. Le premier paramĂštre est le nombre en virgule flottante Ă  fournir Ă  log (3). Si le deuxiĂšme paramĂštre, optionnel, est fourni, _LIB_VERSION est configurĂ© Ă  la valeur _SVID_ de telle sorte que matherr () soit appelĂ©e et l’entier fourni sur la ligne de commande est utilisĂ© comme valeur renvoyĂ©e par matherr (). Si le troisiĂšme paramĂštre, optionnel, est fourni, il spĂ©cifie une autre valeur que matherr () doit positionner comme valeur renvoyĂ©e de la fonction mathĂ©matique.

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

Source du programme

#define _SVID_SOURCE
#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
static int matherr_ret = 0; /* Value that matherr()
should return */
static int change_retval = 0; /* Should matherr() change
function's return value? */
static double new_retval; /* New function return value */
int
matherr(struct exception *exc)
{
fprintf(stderr, "matherr %s exception in %s() function\n",
(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\n",
exc->arg1, exc->arg2);
fprintf(stderr, " retval: %f\n", 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 <argval>"
" [<matherr-ret> [<new-func-retval>]]\n", 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\n", x);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

fenv (3), math_error (7), standards (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

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 à debian-l10n-french@lists.debian.org .