Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
ilogb
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Definido en el encabezado <cmath>
(1)
int ilogb ( float num ) ;

int ilogb ( double num ) ;

int ilogb ( long double num ) ;
(desde C++11)
(hasta C++23)
constexpr int ilogb ( /* floating-point-type */ num ) ;
(desde C++23)
int ilogbf ( float num ) ;
(2) (desde C++11)
(constexpr desde C++23)
int ilogbl ( long double num ) ;
(3) (desde C++11)
(constexpr desde C++23)
#define FP_ILOGB0   /* implementation-defined */
(4) (desde C++11)
#define FP_ILOGBNAN /* implementation-defined */
(5) (desde C++11)
Definido en el encabezado <cmath>
template < class Integer >
int ilogb ( Integer num ) ;
(A) (desde C++11)
(constexpr desde C++23)
1-3) Extrae el valor del exponente sin sesgo del argumento de punto flotante num , y lo devuelve como un valor entero con signo. La biblioteca proporciona sobrecargas de std::ilogb para todos los tipos de punto flotante sin calificación cv como el tipo del parámetro num . (since C++23)
4) Se expande a una expresión constante entera cuyo valor es INT_MIN o - INT_MAX .
5) Se expande a una expresión constante entera cuyo valor es INT_MIN o + INT_MAX .
A) Se proporcionan sobrecargas adicionales para todos los tipos enteros, los cuales son tratados como double .

Formalmente, el exponente sin sesgo es la parte integral de log r |num| como un valor integral con signo, para num distinto de cero, donde r es std:: numeric_limits < T > :: radix y T es el tipo de punto flotante de num .

Contenidos

Parámetros

num - valor de punto flotante o entero

Valor de retorno

Si no ocurren errores, el exponente imparcial de num se devuelve como un valor int con signo.

Si num es cero, FP_ILOGB0 es devuelto.

Si num es infinito, INT_MAX es devuelto.

Si num es un NaN, FP_ILOGBNAN es retornado.

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 reportan como se especifica en math_errhandling .

Puede ocurrir un error de dominio o de rango si num es cero, infinito o NaN.

Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN , puede ocurrir un error de dominio o un error de rango.

Si la implementación soporta aritmética de punto flotante IEEE (IEC 60559),

Notas

Si num no es cero, infinito o NaN, el valor devuelto es exactamente equivalente a static_cast < int > ( std:: logb ( num ) ) .

POSIX requiere que ocurra un error de dominio si num es cero, infinito, NaN, o si el resultado correcto está fuera del rango de int .

POSIX también requiere que, en sistemas conformes 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 puede representarse como int en todas las implementaciones conocidas. Para que ocurra desbordamiento, INT_MAX debe ser menor que LDBL_MAX_EXP * std:: log2 ( FLT_RADIX ) o INT_MIN debe ser mayor que LDBL_MIN_EXP - LDBL_MANT_DIG ) * std:: log2 ( FLT_RADIX ) .

El valor del exponente devuelto por std::ilogb siempre es 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 , |num*r -e
|
está entre 1 y r (típicamente entre 1 y 2 ), pero para el exponente e devuelto por std::frexp , |num*2 -e
|
está entre 0.5 y 1 .

Las sobrecargas adicionales no requieren ser proporcionadas exactamente como (A) . Solo necesitan ser suficientes para garantizar que para su argumento num de tipo entero, std :: ilogb ( num ) tenga el mismo efecto que std :: ilogb ( static_cast < double > ( num ) ) .

Ejemplo

Compara diferentes funciones de descomposición de punto flotante:

#include <cfenv>
#include <cmath>
#include <iostream>
#include <limits>
// #pragma STDC FENV_ACCESS ON
int main()
{
    double f = 123.45;
    std::cout << "Given the number " << f << " or " << std::hexfloat
              << f << std::defaultfloat << " in hex,\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() makes " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "ilogb(0) = " << std::ilogb(0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

Salida posible:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
ilogb(0) = -2147483648
    FE_INVALID raised

Véase también

(C++11) (C++11)
descompone un número en significando y exponente de base- 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)