FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
|
Défini dans l'en-tête
<fenv.h>
|
||
|
#define FE_DIVBYZERO /*implementation defined power of 2*/
|
(depuis C99) | |
|
#define FE_INEXACT /*implementation defined power of 2*/
|
(depuis C99) | |
|
#define FE_INVALID /*implementation defined power of 2*/
|
(depuis C99) | |
|
#define FE_OVERFLOW /*implementation defined power of 2*/
|
(depuis C99) | |
|
#define FE_UNDERFLOW /*implementation defined power of 2*/
|
(depuis C99) | |
|
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \
FE_INVALID | FE_OVERFLOW | \
|
(depuis C99) | |
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 n'est définie que 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 d'une opération en virgule flottante antérieure était trop grand pour être représentable |
FE_UNDERFLOW
|
le résultat d'une 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
<fenv.h>
pour identifier des exceptions de 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 <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("exceptions raised:"); if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO"); if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT"); if(fetestexcept(FE_INVALID)) printf(" FE_INVALID"); if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW"); if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW"); feclearexcept(FE_ALL_EXCEPT); printf("\n"); } int main(void) { printf("MATH_ERREXCEPT is %s\n", math_errhandling & MATH_ERREXCEPT ? "set" : "not set"); printf("0.0/0.0 = %f\n", 0.0/0.0); show_fe_exceptions(); printf("1.0/0.0 = %f\n", 1.0/0.0); show_fe_exceptions(); printf("1.0/10.0 = %f\n", 1.0/10.0); show_fe_exceptions(); printf("sqrt(-1) = %f\n", sqrt(-1)); show_fe_exceptions(); printf("DBL_MAX*2.0 = %f\n", DBL_MAX*2.0); show_fe_exceptions(); printf("nextafter(DBL_MIN/pow(2.0,52),0.0) = %.1f\n", nextafter(DBL_MIN/pow(2.0,52),0.0)); show_fe_exceptions(); }
Sortie possible :
MATH_ERREXCEPT is set 0.0/0.0 = nan exceptions raised: FE_INVALID 1.0/0.0 = inf exceptions raised: FE_DIVBYZERO 1.0/10.0 = 0.100000 exceptions raised: FE_INEXACT sqrt(-1) = -nan exceptions raised: FE_INVALID DBL_MAX*2.0 = inf exceptions raised: FE_INEXACT FE_OVERFLOW nextafter(DBL_MIN/pow(2.0,52),0.0) = 0.0 exceptions raised: FE_INEXACT FE_UNDERFLOW
Références
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.6/6 Environnement en virgule flottante <fenv.h> (p: 207)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.6/5 Environnement en virgule flottante <fenv.h> (p: 188)
Voir aussi
|
(C99)
(C99)
(C99)
|
définit le mécanisme de gestion d'erreur utilisé par les fonctions mathématiques courantes
(constante macro) |
|
Documentation C++
pour
les macros d'exception en virgule flottante
|
|