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)
(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)
 
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.

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

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