Provided by: manpages-fr-dev_4.27.0-1_all bug

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 :

              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

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).
       ┌──────────────────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │ InterfaceAttributValeur  │
       ├──────────────────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │ matherr()                                                            │ Sécurité des threads │ MT-Safe │
       └──────────────────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

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.

Pages du manuel de Linux 6.9.1                    15 juin 2024                                        matherr(3)