Espacios de nombres
Variantes
Acciones

std::ilogb, std::ilogbf, std::ilogbl

De cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
Funciones matemáticas comunes
Funciones
Operaciones básicas
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones exponenciales
(C++11)
(C++11)
(C++11)
(C++11)
Funciones de potencias
(C++11)
(C++11)
Funciones trigonométricas e hiperbólicas
(C++11)
(C++11)
(C++11)
Funciones de error y gamma
(C++11)
(C++11)
(C++11)
(C++11)
Operaciones de punto flotante del entero más cercano
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones de manipulación de punto flotante
(C++11)(C++11)
ilogb
(C++11)
(C++11)
Clasificación/comparación
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Constantes de macro
(C++11)(C++11)(C++11)(C++11)(C++11)
 
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)
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.

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):

[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)[editar]
(C++11)(C++11)(C++11)
Extrae el exponente del número
(función)[editar]
(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)[editar]
close