Namespaces
Variants

ilogb, ilogbf, ilogbl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
(C99) (C99)
ilogb llogb
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
FP_ILOGB0 FP_ILOGBNAN
(C99) (C99)
FP_LLOGB0 FP_LLOGBNAN
(C23) (C23)
Error handling
Fast operation indicators
Definido en el encabezado <math.h>
int ilogbf ( float arg ) ;
(1) (desde C99)
int ilogb ( double arg ) ;
(2) (desde C99)
int ilogbl ( long double arg ) ;
(3) (desde C99)
Definido en el encabezado <tgmath.h>
#define ilogb( arg )
(4) (desde C99)
Definido en el encabezado <math.h>
#define FP_ILOGB0    /* definido por la implementación */
(5) (desde C99)
#define FP_ILOGBNAN  /* definido por la implementación */
(6) (desde C99)
1-3) Extrae el valor del exponente sin sesgo del argumento de punto flotante arg , y lo devuelve como un valor entero con signo.
4) Macros genéricas de tipos: Si arg tiene tipo long double , ilogbl es llamado. De lo contrario, si arg tiene tipo entero o el tipo double , ilogb es llamado. De lo contrario, ilogbf es llamado.
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 sin sesgo es la parte integral de log r |arg| como un valor integral con signo, para arg distinto de cero, donde r es FLT_RADIX .

Contenidos

Parámetros

arg - valor de punto flotante

Valor de retorno

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

Si arg es cero, FP_ILOGB0 es devuelto.

Si arg es infinito, INT_MAX es devuelto.

Si arg 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 y puede ocurrir un error de dominio o un error de rango.

Manejo de errores

Los errores se reportan como se especifica en math_errhandling .

Puede ocurrir un error de dominio o de rango si arg 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 arg no es cero, infinito, o NaN, el valor devuelto es exactamente equivalente a ( int ) logb ( arg ) .

POSIX requiere que ocurra 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 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 * 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 ilogb siempre es 1 menos que el exponente devuelto por frexp debido a los diferentes requisitos de normalización: para el exponente e devuelto por ilogb , |arg*r -e
|
está entre 1 y r (típicamente entre 1 y 2 ), pero para el exponente e devuelto por frexp , |arg*2 -e
|
está entre 0.5 y 1 .

Ejemplo

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
int main(void)
{
    double f = 123.45;
    printf("Dado el número %.2f o %a en hexadecimal,\n", f, f);
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() produce %.0f + %.2f\n", f3, f2);
    int i;
    f2 = frexp(f, &i);
    printf("frexp() produce %f * 2^%d\n", f2, i);
    i = ilogb(f);
    printf("logb()/ilogb() producen %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
    // manejo de errores
    feclearexcept(FE_ALL_EXCEPT);
    printf("ilogb(0) = %d\n", ilogb(0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID generada");
}

Salida posible:

Dado el número 123.45 o 0x1.edccccccccccdp+6 en hexadecimal,
modf() produce 123 + 0.45
frexp() produce 0.964453 * 2^7
logb()/ilogb() producen 1.92891 * 2^6
ilogb(0) = -2147483648
    FE_INVALID generada

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.12/8 Matemáticas <math.h> (p: TBD)
  • 7.12.6.5 Las funciones ilogb (p: TBD)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: TBD)
  • F.10.3.5 Las funciones ilogb (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.12/8 Matemáticas <math.h> (p: TBD)
  • 7.12.6.5 Las funciones ilogb (p: TBD)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: TBD)
  • F.10.3.5 Las funciones ilogb (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.12/8 Matemáticas <math.h> (p: 232)
  • 7.12.6.5 Las funciones ilogb (p: 244)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: 373-375)
  • F.10.3.5 Las funciones ilogb (p: 521)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.12/8 Matemáticas <math.h> (p: 213)
  • 7.12.6.5 Las funciones ilogb (p: 224-225)
  • 7.22 Matemáticas genéricas de tipos <tgmath.h> (p: 335-337)
  • F.9.3.5 Las funciones ilogb (p: 458)

Véase también

descompone un número en significando y una potencia de 2
(función)
(C99) (C99) (C99)
extrae el exponente del número dado
(función)
(C99) (C99) (C99) (C99) (C99) (C99)
calcula eficientemente un número multiplicado por FLT_RADIX elevado a una potencia
(función)