Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
math_errhandling MATH_ERRNO MATH_ERREXCEPT
(C++11)
(C++11)
(C++11)
Défini dans l'en-tête <cmath>
#define MATH_ERRNO        1
(depuis C++11)
#define MATH_ERREXCEPT    2
(depuis C++11)
#define math_errhandling  /*implementation defined*/
(depuis C++11)

La constante de 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 <cfenv> .
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 Exception en virgule flottante 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 std:: acos ( 2 )
Erreur de pôle Le résultat mathématique de la fonction est exactement infini ou indéfini ERANGE FE_DIVBYZERO std:: log ( 0.0 ) , 1.0 / 0.0
Erreur de plage due à un 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 std:: pow ( DBL_MAX , 2 )
Erreur de plage due à un 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é) std:: sqrt ( 2 ) , 1.0 / 10.0

Notes

Le fait que FE_INEXACT soit levé 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 std::rint vs std::nearbyint ).

Avant C++11, 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 <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "MATH_ERRNO is "
              << (math_errhandling & MATH_ERRNO ? "set" : "not set") << '\n'
              << "MATH_ERREXCEPT is "
              << (math_errhandling & MATH_ERREXCEPT ? "set" : "not set") << '\n';
    std::feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    std::cout <<  "log(0) = " << std::log(0) << '\n';
    if (errno == ERANGE)
        std::cout << "errno = ERANGE (" << std::strerror(errno) << ")\n";
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "FE_DIVBYZERO (pole error) reported\n";
}

Sortie possible :

MATH_ERRNO is set
MATH_ERREXCEPT is set
log(0) = -inf
errno = ERANGE (Numerical result out of range)
FE_DIVBYZERO (pole error) reported

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