FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
|
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
- résultats des fonctions mathématiques de la bibliothèque standard
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
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
|
(C99)
(C99)
|
obtient ou définit la direction d'arrondi
(fonction) |
|
Documentation C++
pour
les macros d'arrondi en virgule flottante
|
|