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é

Pragmas de contrôle

Les arrondis décimaux Version de l'entête


Entête à inclure

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

#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. */
    }
}
Activer l'accès à l'environnement flottant

Pragma FENV_ROUND

#pragma STDC FENV_ROUND direction
#pragma STDC FENV_ROUND FE_DYNAMIC
NomRô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;
}
Arrondi constant de traduction

Pragma FENV_DEC_ROUND

#pragma STDC FENV_DEC_ROUND dec-direction
NomRô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

Arrondi décimal constant
Ces pragmas sont fortement dépendants du compilateur et de son niveau de support C23. Ils doivent donc être testés sur votre chaîne de compilation cible.

Sujets connexes

Arrondis décimaux
Arrondis binaires
Environnement flottant
Exceptions en virgule flottante


Les arrondis décimaux Version de l'entête




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