Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
MATH_ERRNO MATH_ERRNOEXCEPT
(C99) (C99)
math_errhandling
(C99)

Fast operation indicators
Défini dans l'en-tête <math.h>
#define MATH_ERRNO        1
(depuis C99)
#define MATH_ERREXCEPT    2
(depuis C99)
#define math_errhandling  /*implementation defined*/
(depuis C99)

La constante macro math_errhandling s'étend en une expression de type int qui est soit égale à MATH_ERRNO , soit égale à MATH_ERREXCEPT , soit égale à leur OU binaire ( MATH_ERRNO | MATH_ERREXCEPT ).

La valeur de math_errhandling indique le type de gestion d'erreur effectué par les opérateurs à virgule flottante et les fonctions :

Constante Explication
MATH_ERREXCEPT indique que les exceptions en virgule flottante sont utilisées : au moins FE_DIVBYZERO , FE_INVALID , et FE_OVERFLOW sont définies dans <fenv.h> .
MATH_ERRNO indique que les opérations en virgule flottante utilisent la variable errno pour signaler les erreurs.

Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559), math_errhandling & MATH_ERREXCEPT doit être différent de zéro.

Les conditions d'erreur en virgule flottante suivantes sont reconnues :

Condition Explication errno floating-point exception Exemple
Erreur de domaine l'argument est en dehors de l'intervalle dans lequel l'opération est mathématiquement définie (la description de chaque fonction liste les erreurs de domaine requises) EDOM FE_INVALID acos ( 2 )
Erreur de pôle le résultat mathématique de la fonction est exactement infini ou indéfini ERANGE FE_DIVBYZERO log ( 0.0 ) , 1.0 / 0.0
Erreur de plage due au dépassement le résultat mathématique est fini, mais devient infini après arrondi, ou devient la plus grande valeur finie représentable après arrondi vers le bas ERANGE FE_OVERFLOW pow ( DBL_MAX , 2 )
Erreur de plage due au sous-dépassement le résultat est non nul, mais devient zéro après arrondi, ou devient sous-normal avec une perte de précision ERANGE ou inchangé (défini par l'implémentation) FE_UNDERFLOW ou rien (défini par l'implémentation) DBL_TRUE_MIN / 2
Résultat inexact le résultat doit être arrondi pour correspondre au type de destination inchangé FE_INEXACT ou rien (non spécifié) sqrt ( 2 ) , 1.0 / 10.0

Table des matières

Notes

Le fait que FE_INEXACT soit déclenché par les fonctions de la bibliothèque mathématique n'est généralement pas spécifié, mais peut être explicitement précisé dans la description de la fonction (par exemple rint vs nearbyint ).

Avant C99, les exceptions en virgule flottante n'étaient pas spécifiées, EDOM était requis pour toute erreur de domaine, ERANGE était requis pour les dépassements de capacité et défini par l'implémentation pour les soupassements.

Exemple

#include <stdio.h>
#include <fenv.h>
#include <math.h>
#include <errno.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set");
    printf("MATH_ERREXCEPT is %s\n",
           math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    printf("log(0) = %f\n", log(0));
    if(errno == ERANGE)
        perror("errno == ERANGE");
    if(fetestexcept(FE_DIVBYZERO))
        puts("FE_DIVBYZERO (pole error) reported");
}

Sortie possible :

MATH_ERRNO is set
MATH_ERREXCEPT is set
log(0) = -inf
errno = ERANGE: Résultat numérique hors limites
FE_DIVBYZERO (pole error) reported

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 377)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 517)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (p: 454)

Voir aussi

exceptions en virgule flottante
(constante macro)
macro qui s'étend à une variable de numéro d'erreur locale au thread compatible POSIX
(variable macro)
documentation C++ pour math_errhandling