MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
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
|
|