Namespaces
Variants

FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT

From cppreference.net
Floating-point environment
Functions
(C++11) (C++11)
(C++11) (C++11)
Macro constants
FE_ALL_EXCEPT FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERFLOW FE_UNDERFLOW
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
(C++11)
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 |  \

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

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