Namespaces
Variants

FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT

From cppreference.net
< c ‎ | numeric ‎ | fenv
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 |  \

FE_UNDERFLOW
(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

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