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é

Directions d'arrondi

Exceptions en virgule flottante Environnement flottant


Entête à inclure

#include <fenv.h>  // <cfenv> en C++

La direction d'arrondi dynamique permet d'influencer certains calculs en virgule flottante. En pratique, le mode par défaut est l'arrondi au plus proche, mais <fenv.h> permet aussi de forcer un arrondi vers le bas, vers le haut ou vers zéro.

Comme pour les indicateurs d'exception, un code qui observe ou modifie l'environnement flottant doit être écrit avec FENV_ACCESS activé.

Macros d'arrondi

Macro Description Depuis
FE_DOWNWARD Arrondi vers le bas. C99
FE_TONEAREST Arrondi au plus proche. C99
FE_TONEARESTFROMZERO Arrondi au plus proche, avec départ de zéro en cas d'égalité. C23
FE_TOWARDZERO Arrondi vers zéro. C99
FE_UPWARD Arrondi vers le haut. C99

Fonctions associées

int fegetround( void );

int fesetround( int rnd );

fegetround renvoie la direction d'arrondi dynamique courante. fesetround tente d'installer une nouvelle direction d'arrondi. La fonction renvoie 0 uniquement si la demande a été acceptée.

Exemple de code

Le programme suivant sauvegarde le mode d'arrondi courant, force un arrondi vers le bas pour un calcul, puis restaure le mode initial.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
#include <fenv.h>
#include <stdio.h>

#pragma STDC FENV_ACCESS ON

int main() {

    int oldRound = fegetround();

    if ( fesetround( FE_DOWNWARD ) != 0 ) {
        puts( "FE_DOWNWARD non supporte" );
        return 1;
    }

    printf( "Arrondi vers le bas : %.20f\n", 1.0 / 10.0 );

    fesetround( oldRound );
    printf( "Mode restaure : %d\n", fegetround() == oldRound );

    return 0;
}
Changer temporairement la direction d'arrondi

Une exécution possible produit un résultat de ce type.

Arrondi vers le bas : 0.09999999999999999167
Mode restaure : 1
Ne supposez pas que toutes les directions d'arrondi existent sur toutes les plates-formes. Le standard permet de ne définir une macro que si l'implémentation sait réellement la gérer.

Sujets connexes

Arrondis décimaux
Environnement flottant
Exceptions en virgule flottante
Pragmas de contrôle


Exceptions en virgule flottante Environnement flottant




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