Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Environnement flottant

Les directions d'arrondi Les arrondis décimaux


Entête à inclure

#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.

Types et macros

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

Fonctions associées

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

Exemple de code

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;
}
Sauvegarder et restaurer l'environnement flottant

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 );
}
Restaurer uniquement les modes de contrôle

Sujets connexes

Arrondis décimaux
Arrondis binaires
Exceptions en virgule flottante
Pragmas de contrôle
Version de l'entête


Les directions d'arrondi Les arrondis décimaux




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé