FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
|
Défini dans l'en-tête
<cfenv>
|
||
|
#define FE_DIVBYZERO /*implementation defined power of 2*/
|
(depuis C++11) | |
|
#define FE_INEXACT /*implementation defined power of 2*/
|
(depuis C++11) | |
|
#define FE_INVALID /*implementation defined power of 2*/
|
(depuis C++11) | |
|
#define FE_OVERFLOW /*implementation defined power of 2*/
|
(depuis C++11) | |
|
#define FE_UNDERFLOW /*implementation defined power of 2*/
|
(depuis C++11) | |
|
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \
FE_INVALID | FE_OVERFLOW | \
|
(depuis C++11) | |
Toutes ces constantes de macro (sauf
FE_ALL_EXCEPT
) se développent en expressions constantes entières qui sont des puissances distinctes de 2, identifiant de manière unique toutes les exceptions en virgule flottante prises en charge. Chaque macro est définie uniquement si elle est prise en charge.
La constante macro
FE_ALL_EXCEPT
, qui s'étend au OU binaire de tous les autres
FE_*
, est toujours définie et vaut zéro si les exceptions en virgule flottante ne sont pas prises en charge par l'implémentation.
| Constante | Explication |
FE_DIVBYZERO
|
erreur de pôle survenue dans une opération en virgule flottante antérieure |
FE_INEXACT
|
résultat inexact : un arrondi était nécessaire pour stocker le résultat d'une opération en virgule flottante antérieure |
FE_INVALID
|
erreur de domaine survenue dans une opération en virgule flottante antérieure |
FE_OVERFLOW
|
le résultat de l'opération en virgule flottante antérieure était trop grand pour être représentable |
FE_UNDERFLOW
|
le résultat de l'opération en virgule flottante antérieure était sous-normal avec une perte de précision |
FE_ALL_EXCEPT
|
OU binaire de toutes les exceptions en virgule flottante prises en charge |
L'implémentation peut définir des constantes macro supplémentaires dans
<cfenv>
pour identifier des exceptions en virgule flottante supplémentaires. Toutes ces constantes commencent par
FE_
suivi d'au moins une lettre majuscule.
Voir math_errhandling pour plus de détails.
Exemple
#include <cfenv> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON volatile double zero = 0.0; // volatile not needed where FENV_ACCESS is supported volatile double one = 1.0; // volatile not needed where FENV_ACCESS is supported int main() { std::feclearexcept(FE_ALL_EXCEPT); std::cout << "1.0/0.0 = " << 1.0 / zero << '\n'; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "division by zero reported\n"; else std::cout << "division by zero not reported\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "1.0/10 = " << one / 10 << '\n'; if (std::fetestexcept(FE_INEXACT)) std::cout << "inexact result reported\n"; else std::cout << "inexact result not reported\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "sqrt(-1) = " << std::sqrt(-1) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << "invalid result reported\n"; else std::cout << "invalid result not reported\n"; }
Sortie possible :
1.0/0.0 = inf division by zero reported 1.0/10 = 0.1 inexact result reported sqrt(-1) = -nan invalid result reported
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
définit le mécanisme de gestion d'erreur utilisé par les fonctions mathématiques communes
(constante macro) |
|
Documentation C
pour
les macros d'exception en virgule flottante
|
|