Namespaces
Variants

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

From es.cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
logb
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Definido en el encabezado <cmath>
(1)
float logb ( float num ) ;

double logb ( double num ) ;

long double logb ( long double num ) ;
(hasta C++23)
constexpr /*floating-point-type*/
logb ( /*floating-point-type*/ num ) ;
(desde C++23)
float logbf ( float num ) ;
(2) (desde C++11)
(constexpr desde C++23)
long double logbl ( long double num ) ;
(3) (desde C++11)
(constexpr desde C++23)
Sobrecarga SIMD (desde C++26)
Definido en el encabezado <simd>
template < /*math-floating-point*/ V >

constexpr /*deduced-simd-t*/ < V >

logb ( const V & v_num ) ;
(S) (desde C++26)
Definido en el encabezado <cmath>
template < class Integer >
double logb ( Integer num ) ;
(A) (constexpr desde C++23)
1-3) Extrae el valor del exponente imparcial independiente de la base del argumento de punto flotante num , y lo devuelve como un valor de punto flotante. La biblioteca proporciona sobrecargas de std::logb para todos los tipos de punto flotante sin calificación cv como el tipo del parámetro. (since C++23)
S) La sobrecarga SIMD realiza un std::logb elemento por elemento en v_num .
(Ver math-floating-point y deduced-simd-t para sus definiciones.)
(desde C++26)
A) Se proporcionan sobrecargas adicionales para todos los tipos enteros, los cuales son tratados como double .
(since C++11)

Formalmente, el exponente no sesgado es la parte entera con signo de log r |num| (devuelto por esta función como un valor de punto flotante), para num distinto de cero, donde r es std:: numeric_limits < T > :: radix y T es el tipo de punto flotante de num . Si num es subnormal, se trata como si estuviera normalizado.

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 de punto flotante con signo.

Si ocurre un error de dominio, se devuelve un valor definido por la implementación.

Si ocurre un error de polo, -HUGE_VAL , -HUGE_VALF , o -HUGE_VALL es devuelto.

Manejo de errores

Los errores se reportan como se especifica en math_errhandling .

Puede ocurrir un error de dominio o rango si num es cero.

Si la implementación soporta aritmética de punto flotante IEEE (IEC 60559),

Notas

POSIX requiere que ocurra un error de polo si num es ±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 , |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 :: logb ( num ) tenga el mismo efecto que std :: logb ( static_cast < double > ( num ) ) .

Ejemplo

Compara diferentes funciones de descomposición de números 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 << "logb(0) = " << std::logb(0) << '\n';
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "    FE_DIVBYZERO 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
logb(0) = -Inf
    FE_DIVBYZERO 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)