std::ilogb, std::ilogbf, std::ilogbl - cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | (desde C++11) (constexpr since C++23) |
|
|
(2) | (desde C++11) (constexpr since C++23) |
|
|
(3) | (desde C++11) (constexpr since C++23) |
|
|
(4) | (desde C++11) (constexpr since C++23) |
|
|
(5) | (desde C++11) |
|
|
(6) | (desde C++11) |
1-3) Extrae el valor del exponente imparcial del argumento de punto flotante arg y lo devuelve como un valor entero con signo.
4) Un conjunto de sobrecargas o una plantilla de función que acepta un argumento de cualquier tipo entero. Equivalente a (2) (el argumento se convierte a double).
5) Se expande a una expresión constante entera cuyo valor es INT_MIN o -INT_MAX.
6) Se expande a una expresión constante entera cuyo valor es INT_MIN o +INT_MAX.
Formalmente, el exponente imparcial es la parte entera de log
r|arg| como valor entero con signo, para arg distinto de cero, donde r es std::numeric_limits<T>::radix y T es el tipo de punto flotante de arg.
Parámetros
| arg | - | Valor de punto flotante. |
Valor de retorno
Si no se producen errores, se devuelve el exponente imparcial de arg como un valor entero con signo.
Si arg es cero, se devuelve FP_ILOGB0.
Si arg es infinito, se devuelve INT_MAX.
Si arg es NaN, se devuelve FP_ILOGBNAN.
Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN, el valor de retorno no está especificado.
Manejo de errores
Los errores se informan como se especifica en math_errhandling.
Puede producirse un error de dominio o un error de rango si arg es cero, infinito, o NaN.
Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN, 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):
- Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN, se genera FE_INVALID.
- Si
arges ±0, ±∞, o NaN, se genera FE_INVALID. - En todos los otros casos, el resultado es exacto (nunca se genera FE_INEXACT) y se ignora el modo de redondeo actual.
Notas
Si arg no es cero, infinito, o NaN, el valor devuelto es exactamente equivalente a static_cast<int>(std::logb(arg)).
POSIX requiere que se produzca un error de dominio si arg es cero, infinito, NaN, o si el resultado correcto está fuera del rango de int.
POSIX también requiere que, en sistemas compatibles con XSI, el valor devuelto cuando el resultado correcto es mayor que INT_MAX sea INT_MAX y el valor devuelto cuando el resultado correcto es menor que INT_MIN sea INT_MIN.
El resultado correcto se puede representar como int en todas las implementaciones conocidas. Para que ocurra el desbordamiento, INT_MAX debe ser menor que LDBL_MAX_EXP*log2(FLT_RADIX) o INT_MIN debe ser mayor que LDBL_MIN_EXP-LDBL_MANT_DIG)*log2(FLT_RADIX).
El valor del exponente devuelto por std::ilogb es siempre 1 menos que el exponente devuelto por std::frexp debido a los diferentes requisitos de normalización: para el exponente e devuelto por std::ilogb, |arg*r-e
| está entre 1 y r (típicamente entre 1 y 2), pero para el exponente e devuelto por std::frexp, |arg*2-e
| está entre 0.5 y 1.
Ejemplo
Compara diferentes funciones de descomposición de punto flotante.
#include <iostream> #include <cmath> #include <limits> #include <cfenv> // #pragma STDC FENV_ACCESS ON int main() { double f = 123.45; std::cout << "Dado el número " << f << "o" << std::hexfloat << f << std::defaultfloat << " en hexadecimal,\n"; double f3; double f2 = std::modf(f, &f3); std::cout << "modf() genera " << f3 << " + " << f2 << '\n'; int i; f2 = std::frexp(f, &i); std::cout << "frexp() genera " << f2 << " * 2^" << i << '\n'; i = std::ilogb(f); std::cout << "logb()/ilogb() genera " << f/std::scalbn(1.0, i) << " * " << std::numeric_limits<double>::radix << "^" << std::ilogb(f) << '\n'; // manejo de errores std::feclearexcept(FE_ALL_EXCEPT); std::cout << "ilogb(0) = " << std::ilogb(0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " Se generó FE_INVALID\n"; }
Posible salida:
Dado el número 123.45o0x1.edccccccccccdp+6 en hexadecimal,
modf() genera 123 + 0.45
frexp() genera 0.964453 * 2^7
logb()/ilogb() genera 1.92891 * 2^6
ilogb(0) = -2147483648
Se generó FE_INVALID