FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
|
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:
- resultados de los operadores aritméticos de punto flotante fuera de expresiones constantes
double x = 1; x / 10; // 0.09999999999999999167332731531132594682276248931884765625 // o 0.1000000000000000055511151231257827021181583404541015625
- resultados de las funciones matemáticas de la biblioteca estándar
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
- conversiones de cadenas como std::strtod o std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // o 0.100000001490116119384765625
- las funciones de redondeo de la biblioteca std::nearbyint , std::rint , std::lrint
std::lrint(2.1); // 2 o 3
El modo de redondeo actual NO afecta a lo siguiente:
- conversión implícita de punto flotante a entero y conversiones (siempre hacia cero),
- resultados de operadores aritméticos de punto flotante en expresiones ejecutadas en tiempo de compilación (siempre al más cercano),
- las funciones de biblioteca std::round , std::lround , std::llround , std::ceil , std::floor , std::trunc .
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
|
|