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)
Definido en el encabezado <cfenv>
#define FE_DOWNWARD /*implementation defined*/
(desde C++11)
#define FE_TONEAREST /*implementation defined*/
(desde C++11)
#define FE_TOWARDZERO /*implementation defined*/
(desde C++11)
#define FE_UPWARD /*implementation defined*/
(desde C++11)

Cada una de estas constantes de macro se expande a una expresión constante entera no negativa, que puede utilizarse con std::fesetround y std::fegetround para indicar uno de los modos de redondeo de punto flotante soportados. La implementación puede definir constantes adicionales de modo de redondeo en <cfenv> , las cuales deben comenzar con FE_ seguido de al menos una letra mayúscula. Cada macro solo se define si está soportada.

Constante Explicación
FE_DOWNWARD redondeo hacia infinito negativo
FE_TONEAREST redondeo hacia el valor representable más cercano
FE_TOWARDZERO redondeo hacia cero
FE_UPWARD redondeo hacia infinito positivo

Modos de redondeo adicionales pueden ser soportados por una implementación.

El modo de redondeo actual afecta a lo siguiente:

double x = 1;
x / 10; // 0.09999999999999999167332731531132594682276248931884765625
     // o 0.1000000000000000055511151231257827021181583404541015625
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875
           // o 1.4142135623730951454746218587388284504413604736328125
  • conversión implícita y conversiones explícitas de punto flotante a punto flotante
double d = 1 + std::numeric_limits<double>::epsilon();
float f = d; // 1.00000000000000000000000
          // o 1.00000011920928955078125
std::stof("0.1"); // 0.0999999940395355224609375
               // o 0.100000001490116119384765625
std::lrint(2.1); // 2 o 3

El modo de redondeo actual NO afecta a lo siguiente:

Como con cualquier funcionalidad del entorno de punto flotante , el redondeo solo está garantizado si #pragma STDC FENV_ACCESS ON está establecido.

Los compiladores que no admiten el pragma pueden ofrecer sus propias formas de soportar el modo de redondeo actual. Por ejemplo Clang y GCC tienen la opción -frounding-math diseñada para desactivar optimizaciones que cambiarían el significado del código sensible al redondeo.

Ejemplo

#include <cfenv>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::fesetround(FE_DOWNWARD);
    std::cout << "redondeo hacia abajo: \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 << "redondeo hacia arriba: \n"
              << "         pi = " << std::acos(-1.f) << '\n'
              << "stof(\"1.1\") = " << std::stof("1.1") << '\n'
              << "  rint(2.1) = " << std::rint(2.1) << '\n';
}

Salida:

redondeo hacia abajo:
         pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
  rint(2.1) = 2
redondeo hacia arriba:
         pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
  rint(2.1) = 3

Véase también

indica los modos de redondeo de punto flotante
(enumeración)
(C++11) (C++11)
obtiene o establece la dirección de redondeo
(función)
Documentación C para macros de redondeo de punto flotante