Namespaces
Variants

FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD

From cppreference.net
Floating-point environment
Functions
(C++11) (C++11)
(C++11) (C++11)
Macro constants
FE_DOWNWARD FE_TONEAREST FE_TOWARDZERO FE_UPWARD
(C++11) (C++11) (C++11) (C++11)
(C++11)
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
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
Seules les parties suivantes ont été traduites : - "or" → "ou" (dans le commentaire) - Tous les autres éléments (code C++, balises HTML, attributs, termes spécifiques C++) ont été préservés tels quels.
std::stof("0.1"); // 0.0999999940395355224609375
               // ou 0.100000001490116119384765625
std::lrint(2.1); // 2 ou 3

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

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