std::logb, std::logbf, std::logbl
Definido en el archivo de encabezado <cmath> | ||
float logb (float arg ); | (1) | (desde C++11) (constexpr since C++23) |
float logbf(float arg ); | (2) | (desde C++11) (constexpr since C++23) |
double logb (double arg ); | (3) | (desde C++11) (constexpr since C++23) |
longdouble logb (longdouble arg ); | (4) | (desde C++11) (constexpr since C++23) |
longdouble logbl(longdouble arg ); | (5) | (desde C++11) (constexpr since C++23) |
double logb ( TipoEntero arg ); | (6) | (desde C++11) (constexpr since C++23) |
arg
, y lo devuelve como un valor de punto flotante.Formalmente, el exponente imparcial es la parte entera de log
r|arg| como valor entero con signo (devuelto por esta función como un valor de punto flotante), para un argumento distinto de cero, donde r
es std::numeric_limits<T>::radix y T
es el tipo de punto flotante de arg
. Si arg
es subnormal, se trata como si estuviera normalizado.
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 de punto flotante con signo.
Si se produce un error de dominio, se devuelve un valor definido por la implementación.
Si se produce un error de polo, se devuelve -HUGE_VAL, -HUGE_VALF
, o -HUGE_VALL
.
[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.
Si la implementación admite la aritmética de punto flotante IEEE (IEC 60559):
- Si
arg
es +0, se devuelve -∞ y se genera FE_DIVBYZERO. - Si
arg
es -0, se devuelve -∞ y se genera FE_DIVBYZERO. - Si
arg
es +∞, se devuelve +∞. - Si
arg
es -∞, se devuelve +∞. - Si
arg
es NaN, se devuelve NaN. - En todos los otros casos, el resultado es exacto (nunca se genera FE_INEXACT) y se ignora el modo de redondeo actual
[editar]Notas
POSIX requiere que se produzca un error de polo si arg
es +0 o -0.
El valor del exponente devuelto por std::logb
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::logb
, |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 ONint 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 erroresstd::feclearexcept(FE_ALL_EXCEPT);std::cout<<"logb(0) = "<< std::logb(0)<<'\n';if(std::fetestexcept(FE_DIVBYZERO))std::cout<<" Se generó FE_DIVBYZERO\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 logb(0) = -inf Se generó FE_DIVBYZERO
[editar]Véase también
(C++11)(C++11) | Descompone un número en mantisa y una potencia de 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 de C para logb |