std::ilogb, std::ilogbf, std::ilogbl
| Definido en el archivo de encabezado <cmath>
|
||
int ilogb ( float arg ); int ilogbf( float arg ); |
(1) | (desde C++11) (constexpr since C++23) |
int ilogb ( double arg ); |
(2) | (desde C++11) (constexpr since C++23) |
int ilogb ( long double arg ); int ilogbl( long double arg ); |
(3) | (desde C++11) (constexpr since C++23) |
int ilogb ( TipoEntero arg ); |
(4) | (desde C++11) (constexpr since C++23) |
#define FP_ILOGB0 /*definido por la implementación*/ |
(5) | (desde C++11) |
#define FP_ILOGBNAN /*definido por la implementación*/ |
(6) | (desde C++11) |
arg y lo devuelve como un valor entero con signo. double).-INT_MAX.+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
Véase también
(C++11)(C++11) |
Descompone un número en mantisa y una potencia de 2 (función) |
(C++11)(C++11)(C++11) |
Extrae el exponente del número (función) |
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11) |
Multiplica un número por FLT_RADIX elevado a una potencia (función) |
Documentación de C para ilogb
| |