#include <fenv.h> // <cfenv> en C++
Les pragmas associés à <fenv.h> servent à informer le traducteur C des contraintes liées à
l'environnement flottant. Ils sont importants, car les optimisations numériques peuvent sinon réordonner ou supprimer
des calculs que votre code cherche précisément à observer.
#pragma STDC FENV_ACCESS ON
#pragma STDC FENV_ACCESS OFF
#pragma STDC FENV_ACCESS DEFAULT
Ce pragma indique que le programme peut tester des indicateurs d'exception, changer des modes de contrôle ou dépendre de l'état courant de l'environnement flottant. Il existe depuis C99.
Le bloc suivant est typique d'un calcul qui doit observer les exceptions flottantes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <fenv.h> #pragma STDC FENV_ACCESS ON void compute() { feclearexcept( FE_ALL_EXCEPT ); /* Calculs numériques sensibles. */ if ( fetestexcept( FE_OVERFLOW ) ) { /* Traitement du dépassement. */ } } |
#pragma STDC FENV_ROUND direction
#pragma STDC FENV_ROUND FE_DYNAMIC
| Nom | Rôle |
|---|---|
FE_DYNAMIC |
Direction spéciale indiquant que l'arrondi doit suivre le mode dynamique courant. |
C23 ajoute FENV_ROUND pour demander une direction d'arrondi constante pendant la traduction. La direction
peut être l'une des macros d'arrondi supportées, comme FE_TONEAREST ou FE_DOWNWARD. La
valeur FE_DYNAMIC signifie que l'arrondi doit suivre le mode dynamique courant.
Le code suivant demande un arrondi vers le bas pour le bloc qui suit le pragma.
1 2 3 4 5 6 7 |
#include <fenv.h> #pragma STDC FENV_ROUND FE_DOWNWARD double lower_bound( double value ) { return value / 10.0; } |
#pragma STDC FENV_DEC_ROUND dec-direction
| Nom | Rôle |
|---|---|
FE_DEC_DYNAMIC |
Direction spéciale indiquant que l'arrondi décimal doit suivre le mode dynamique courant. |
C23 ajoute aussi FENV_DEC_ROUND pour les flottants décimaux. Il n'est disponible que lorsque
__STDC_IEC_60559_DFP__ est défini. La valeur FE_DEC_DYNAMIC indique que les opérations
décimales suivent le mode d'arrondi décimal dynamique.
Voici un exemple minimal montrant la forme attendue par le préprocesseur.
1 2 3 4 5 |
#include <fenv.h> #ifdef __STDC_IEC_60559_DFP__ #pragma STDC FENV_DEC_ROUND FE_DEC_TONEAREST |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :