Espacios de nombres
Variantes

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

De cppreference.com
 
 
 
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)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
Clasificación/comparación
(C++11)
(C++11)
(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)
 
<tbody> </tbody>
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)
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 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.

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) [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]