FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
|
Défini dans l'en-tête
<cfenv>
|
||
|
#define FE_DOWNWARD /*implementation defined*/
|
(depuis C++11) | |
|
#define FE_TONEAREST /*implementation defined*/
|
(depuis C++11) | |
|
#define FE_TOWARDZERO /*implementation defined*/
|
(depuis C++11) | |
|
#define FE_UPWARD /*implementation defined*/
|
(depuis C++11) | |
Chacune de ces constantes de macro se développe en une expression constante entière non négative, qui peut être utilisée avec
std::fesetround
et
std::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
<cfenv>
, qui doivent toutes commencer par
FE_
suivi d'au moins une lettre majuscule. Chaque macro est définie uniquement 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 arithmetic operators 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
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875 // ou 1.4142135623730951454746218587388284504413604736328125
- conversion et transtypage implicites de nombres à virgule flottante vers nombres à virgule flottante
double d = 1 + std::numeric_limits<double>::epsilon(); float f = d; // 1.00000000000000000000000 // ou 1.00000011920928955078125
- conversions de chaînes telles que std::strtod ou std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // ou 0.100000001490116119384765625
- les fonctions d'arrondi de la bibliothèque std::nearbyint , std::rint , std::lrint
std::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 exécutées à la compilation (toujours vers le plus proche),
- les fonctions de bibliothèque std::round , std::lround , std::llround , std::ceil , std::floor , std::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 <cfenv> #include <cmath> #include <iomanip> #include <iostream> #include <string> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_DOWNWARD); std::cout << "arrondi vers le bas : \n" << std::setprecision(50) << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << "\n\n"; std::fesetround(FE_UPWARD); std::cout << "arrondi vers le haut : \n" << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << '\n'; }
Sortie :
arrondi vers le bas :
pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
rint(2.1) = 2
arrondi vers le haut :
pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
rint(2.1) = 3
Voir aussi
|
indique les modes d'arrondi en virgule flottante
(énumération) |
|
|
(C++11)
(C++11)
|
obtient ou définit la direction d'arrondi
(fonction) |
|
Documentation C
pour
les macros d'arrondi en virgule flottante
|
|