ilogb, ilogbf, ilogbl
|
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) |
ilogbl
es llamado. De lo contrario, si
arg
tiene tipo entero o el tipo
double
,
ilogb
es llamado. De lo contrario,
ilogbf
es llamado.
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),
- Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN , FE_INVALID se activa.
- Si arg es ±0, ±∞, o NaN, FE_INVALID se activa.
- En todos los demás casos, el resultado es exacto ( FE_INEXACT nunca se activa) y el modo de redondeo actual se ignora.
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
|
(C99)
(C99)
|
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) |
|
Documentación de C++
para
ilogb
|
|