Espacios de nombres
Variantes
Acciones

std::logb, std::logbf, std::logbl

De cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
Funciones matemáticas comunes
Funciones
Operaciones básicas
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones exponenciales
(C++11)
(C++11)
(C++11)
(C++11)
Funciones de potencias
(C++11)
(C++11)
Funciones trigonométricas e hiperbólicas
(C++11)
(C++11)
(C++11)
Funciones de error y gamma
(C++11)
(C++11)
(C++11)
(C++11)
Operaciones de punto flotante del entero más cercano
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones de manipulación de punto flotante
(C++11)(C++11)
(C++11)
logb
(C++11)
Clasificación/comparación
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Constantes de macro
(C++11)(C++11)(C++11)(C++11)(C++11)
 
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)
1-5) Extrae el valor del exponente imparcial independiente de la base del argumento de punto flotante arg, y lo devuelve como un valor de punto flotante.
6) Un conjunto de sobrecargas o una plantilla de función que acepta un argumento de cualquier tipo entero. Equivalente a (3) (el argumento se convierte a double).

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)[editar]
(C++11)(C++11)(C++11)
Extrae el exponente del número
(función)[editar]
(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)[editar]
close