std:: ilogb, std:: ilogbf, std:: ilogbl
|
Definido en el encabezado
<cmath>
|
||
| (1) | ||
|
int
ilogb
(
float
num
)
;
int
ilogb
(
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) |
std::ilogb
para todos los tipos de punto flotante sin calificación cv como el tipo del parámetro
num
.
(since C++23)
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),
- Si el resultado correcto es mayor que INT_MAX o menor que INT_MIN , FE_INVALID se activa.
- Si num 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 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) |
|
Documentación C
para
ilogb
|
|