Namespaces
Variants

FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD

From cppreference.net
< c ‎ | numeric ‎ | fenv
Défini dans l'en-tête <fenv.h>
#define FE_DOWNWARD     /*implementation defined*/
(depuis C99)
#define FE_TONEAREST    /*implementation defined*/
(depuis C99)
#define FE_TOWARDZERO   /*implementation defined*/
(depuis C99)
#define FE_UPWARD       /*implementation defined*/
(depuis C99)

Chacune de ces constantes de macro se développe en une expression constante entière non négative, qui peut être utilisée avec fesetround et fegetround pour indiquer l'un des modes d'arrondi en virgule flottante pris en charge. L'implémentation peut définir des constantes de mode d'arrondi supplémentaires dans <fenv.h> , qui doivent toutes commencer par FE_ suivi d'au moins une lettre majuscule. Chaque macro n'est définie que si elle est prise en charge.

Constante Explication
FE_DOWNWARD arrondi vers l'infini négatif
FE_TONEAREST arrondi vers la valeur représentable la plus proche
FE_TOWARDZERO arrondi vers zéro
FE_UPWARD arrondi vers l'infini positif

Des modes d'arrondi supplémentaires peuvent être pris en charge par une implémentation.

Le mode d'arrondi actuel affecte les éléments suivants :

  • résultats des opérateurs arithmétiques en virgule flottante en dehors des expressions constantes
double x = 1;
x / 10; // 0.09999999999999999167332731531132594682276248931884765625 ou
        // 0.1000000000000000055511151231257827021181583404541015625
sqrt(2); // 1.41421356237309492343001693370752036571502685546875 ou
         // 1.4142135623730951454746218587388284504413604736328125
  • conversion et casts implicites de virgule flottante à virgule flottante
double d = 1 + DBL_EPSILON;
float f = d; // 1.00000000000000000000000 ou
             // 1.00000011920928955078125
strtof("0.1", NULL); // 0.0999999940395355224609375 ou
                     // 0.100000001490116119384765625
lrint(2.1); // 2 ou 3

Le mode d'arrondi actuel n'affecte PAS les éléments suivants :

  • conversion implicite et casts de virgule flottante vers entier (toujours vers zéro)
  • résultats des opérateurs arithmétiques en virgule flottante dans les expressions constantes exécutées à la compilation (toujours vers le plus proche)
  • les fonctions de bibliothèque round , lround , llround , ceil , floor , trunc

Comme pour toute fonctionnalité d'environnement de virgule flottante , l'arrondi n'est garanti que si #pragma STDC FENV_ACCESS ON est défini.

Les compilateurs qui ne prennent pas en charge le pragma peuvent offrir leurs propres méthodes pour supporter le mode d'arrondi actuel. Par exemple Clang et GCC ont l'option -frounding-math destinée à désactiver les optimisations qui modifieraient la signification du code sensible aux arrondis.

Exemple

#include <fenv.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
// #pragma STDC FENV_ACCESS ON
int main()
{
    fesetround(FE_DOWNWARD);
    puts("arrondi vers le bas : ");
    printf("           pi = %.22f\n", acosf(-1));
    printf("strtof(\"1.1\") = %.22f\n", strtof("1.1", NULL));
    printf("    rint(2.1) = %.22f\n\n", rintf(2.1));
    fesetround(FE_UPWARD);
    puts("arrondi vers le haut : ");
    printf("           pi = %.22f\n", acosf(-1));
    printf("strtof(\"1.1\") = %.22f\n", strtof("1.1", NULL));
    printf("    rint(2.1) = %.22f\n", rintf(2.1));
}

Sortie :

arrondi vers le bas :
           pi = 3.1415925025939941406250
strtof("1.1") = 1.0999999046325683593750
    rint(2.1) = 2.0000000000000000000000
arrondi vers le haut :
           pi = 3.1415927410125732421875
strtof("1.1") = 1.1000000238418579101563
    rint(2.1) = 3.0000000000000000000000

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.6/8 Environnement en virgule flottante <fenv.h> (p: À DÉTERMINER)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.6/8 Environnement en virgule flottante <fenv.h> (p: 151)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.6/8 Environnement de virgule flottante <fenv.h> (p: 207)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.6/7 Environnement de virgule flottante <fenv.h> (p: 188)

Voir aussi

obtient ou définit la direction d'arrondi
(fonction)
Documentation C++ pour les macros d'arrondi en virgule flottante