std::round, std::roundf, std::roundl, std::lround, std::lroundf, std::lroundl
| Definido en el archivo de encabezado <cmath>
|
||
float round ( float arg ); |
(1) | (desde C++11) (constexpr since C++23) |
float roundf( float arg ); |
(2) | (desde C++11) (constexpr since C++23) |
double round ( double arg ); |
(3) | (desde C++11) (constexpr since C++23) |
long double round ( long double arg ); |
(4) | (desde C++11) (constexpr since C++23) |
long double roundl( long double arg ); |
(5) | (desde C++11) (constexpr since C++23) |
double round ( TipoEntero arg ); |
(6) | (desde C++11) (constexpr since C++23) |
long lround ( float arg ); |
(7) | (desde C++11) (constexpr since C++23) |
long lroundf( float arg ); |
(8) | (desde C++11) (constexpr since C++23) |
long lround ( double arg ); |
(9) | (desde C++11) (constexpr since C++23) |
long lround ( long double arg ); |
(10) | (desde C++11) (constexpr since C++23) |
long lroundl( long double arg ); |
(11) | (desde C++11) (constexpr since C++23) |
long lround ( TipoEntero arg ); |
(12) | (desde C++11) (constexpr since C++23) |
long long llround ( float arg ); |
(13) | (desde C++11) (constexpr since C++23) |
long long llroundf( float arg ); |
(14) | (desde C++11) (constexpr since C++23) |
long long llround ( double arg ); |
(15) | (desde C++11) (constexpr since C++23) |
long long llround ( long double arg ); |
(16) | (desde C++11) (constexpr since C++23) |
long long llroundl( long double arg ); |
(17) | (desde C++11) (constexpr since C++23) |
long long llround ( TipoEntero arg ); |
(18) | (desde C++11) (constexpr since C++23) |
arg (en formato de punto flotante), redondeando la mitad de los casos desde cero, independientemente del modo de redondeo actual.arg (en formato de entero), redondeando la mitad de los casos desde cero, independientemente del modo de redondeo actual.double).Parámetros
| arg | - | Valor de punto flotante. |
Valor de retorno
Si no se producen errores, se devuelve el valor entero más cercano a arg, redondeando la mitad de los casos desde cero.
Si se produce un error de dominio, se devuelve un valor definido por la implementación.
Manejo de errores
Los errores se informan como se especifica en math_errhandling.
Si el resultado de std::lround o std::llround está fuera del rango representable por el tipo de retorno, puede producirse un error de dominio o un error de rango.
Si la implementación admite la aritmética de punto flotante IEEE (IEC 60559):
- Para la función
std::round:
- El modo de redondeo actual no tiene efecto.
- Si
arges +∞, se devuelve +∞. - Si
arges -∞, se devuelve -∞. - Si
arges +0, se devuelve +0. - Si
arges -0, se devuelve -0. - Si
arges NaN, se devuelve NaN.
- Para las funciones
std::lroundystd::llround:
- Nunca se genera FE_INEXACT.
- El modo de redondeo actual no tiene efecto.
- Si
arges +∞ o -∞, se genera FE_INVALID y se devuelve un valor definido por la implementación. - Si el resultado del redondeo está fuera del rango del tipo de retorno, se genera FE_INVALID y se devuelve un valor definido por la implementación.
- Si
arges NaN, se genera FE_INVALID y se devuelve un valor definido por la implementación.
Notas
Se puede generar FE_INEXACT (pero no es obligatorio) por std::round al redondear un valor finito no entero.
Los valores de punto flotante representables más grandes son enteros exactos en todos los formatos de punto flotante estándar, por lo que std::round nunca se desborda por sí solo; sin embargo, el resultado puede desbordar cualquier tipo de entero (incluido std::intmax_t), cuando se almacena en una variable entera.
POSIX especifica que todos los casos donde std::lround o std::llround generen FE_INEXACT sean errores de dominio.
La versión double de std::round se comporta como si estuviera implementada de la siguiente manera:
#include <cmath>
#include <cfenv>
#pragma STDC FENV_ACCESS ON
double round(double x)
{
std::fenv_t save_env;
std::feholdexcept(&save_env);
double result = std::rint(x);
if (std::fetestexcept(FE_INEXACT)) {
auto const save_round = std::fegetround();
std::fesetround(FE_TOWARDZERO);
result = std::rint(std::copysign(0.5 + std::fabs(x), x));
std::fesetround(save_round);
}
std::feupdateenv(&save_env);
return result;
}
Ejemplo
#include <iostream>
#include <cmath>
#include <cfenv>
#include <climits>
// #pragma STDC FENV_ACCESS ON
int main()
{
// round
std::cout << "round(+2.3) = " << std::round(2.3)
<< " round(+2.5) = " << std::round(2.5)
<< " round(+2.7) = " << std::round(2.7) << '\n'
<< "round(-2.3) = " << std::round(-2.3)
<< " round(-2.5) = " << std::round(-2.5)
<< " round(-2.7) = " << std::round(-2.7) << '\n';
std::cout << "round(-0.0) = " << std::round(-0.0) << '\n'
<< "round(-Inf) = " << std::round(-INFINITY) << '\n';
// lround
std::cout << "lround(+2.3) = " << std::lround(2.3)
<< " lround(+2.5) = " << std::lround(2.5)
<< " lround(+2.7) = " << std::lround(2.7) << '\n'
<< "lround(-2.3) = " << std::lround(-2.3)
<< " lround(-2.5) = " << std::lround(-2.5)
<< " lround(-2.7) = " << std::lround(-2.7) << '\n';
std::cout << "lround(-0.0) = " << std::lround(-0.0) << '\n'
<< "lround(-Inf) = " << std::lround(-INFINITY) << '\n';
// manejo de errores
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "std::lround(LONG_MAX+1.5) = "
<< std::lround(LONG_MAX+1.5) << '\n';
if (std::fetestexcept(FE_INVALID))
std::cout << " se generó FE_INVALID\n";
}
Posible salida:
round(+2.3) = 2 round(+2.5) = 3 round(+2.7) = 3
round(-2.3) = -2 round(-2.5) = -3 round(-2.7) = -3
round(-0.0) = -0
round(-Inf) = -inf
lround(+2.3) = 2 lround(+2.5) = 3 lround(+2.7) = 3
lround(-2.3) = -2 lround(-2.5) = -3 lround(-2.7) = -3
lround(-0.0) = 0
lround(-Inf) = -9223372036854775808
std::lround(LONG_MAX+1.5) = -9223372036854775808
se generó FE_INVALID
Véase también
(C++11)(C++11) |
Entero más cercano no mayor que el valor dado (función) |
(C++11)(C++11) |
Entero más cercano entero no menor que el valor dado. (función) |
(C++11)(C++11)(C++11) |
Entero más cercano no mayor en magnitud que el valor dado (función) |
Documentación de C para round
| |