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 (longdouble arg ); int ilogbl(longdouble 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. 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
.
Contenido |
[editar]Parámetros
arg | - | Valor de punto flotante. |
[editar]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.
[editar]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
arg
es ±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.
[editar]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.
[editar]Ejemplo
Compara diferentes funciones de descomposición de punto flotante.
#include <iostream>#include <cmath>#include <limits>#include <cfenv> // #pragma STDC FENV_ACCESS ONint 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 erroresstd::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
[editar]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 |