#include <fenv.h> // <cfenv> en C++
L'environnement flottant dynamique regroupe les indicateurs d'exception et les modes de contrôle utilisés par les
calculs en virgule flottante. Le type fenv_t permet de sauvegarder l'ensemble de cet environnement.
C23 ajoute femode_t, qui se concentre sur les modes de contrôle.
| Nom | Description | Depuis |
|---|---|---|
FE_DFL_ENV |
Environnement flottant par défaut, installé au démarrage du programme. | C99 |
FE_DFL_MODE |
Etat par défaut des modes de contrôle dynamiques. | C23 |
fenv_t |
Type représentant tout l'environnement flottant dynamique. | C99 |
femode_t |
Type représentant les modes de contrôle dynamiques, dont le mode d'arrondi. | C23 |
| Fonction | Rôle | Depuis |
|---|---|---|
int fegetenv( fenv_t * envp ); |
Sauvegarde l'environnement flottant courant. | C99 |
int fegetmode( femode_t * modep ); |
Sauvegarde les modes de contrôle dynamiques courants. | C23 |
int feholdexcept( fenv_t * envp ); |
Sauvegarde l'environnement, efface les indicateurs et installe si possible un mode sans arrêt. | C99 |
int fesetenv( const fenv_t * envp ); |
Restaure un environnement sauvegardé ou l'environnement par défaut. | C99 |
int fesetmode( const femode_t * modep ); |
Restaure des modes de contrôle dynamiques. | C23 |
int feupdateenv( const fenv_t * envp ); |
Restaure un environnement tout en relevant ensuite les exceptions déjà présentes. | C99 |
Le programme suivant sauvegarde l'environnement courant, modifie temporairement le mode d'arrondi, puis restaure tout l'environnement initial.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <fenv.h> #include <stdio.h> #pragma STDC FENV_ACCESS ON int main() { fenv_t savedEnvironment; fegetenv( &savedEnvironment ); fesetround( FE_UPWARD ); printf( "Mode modifie : %d\n", fegetround() == FE_UPWARD ); fesetenv( &savedEnvironment ); printf( "Mode restaure : %d\n", fegetround() != FE_UPWARD ); return 0; } |
Une exécution possible produit l'affichage suivant.
Mode modifie : 1 Mode restaure : 1
Avec C23, le duo fegetmode / fesetmode permet de manipuler seulement les modes de contrôle,
sans embarquer les indicateurs d'exception.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <fenv.h> #pragma STDC FENV_ACCESS ON void compute_with_default_modes() { femode_t oldModes; fegetmode( &oldModes ); fesetmode( FE_DFL_MODE ); /* Calculs réalisés avec les modes par défaut. */ fesetmode( &oldModes ); } |
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 :