Namespaces
Variants

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

From ru.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
Определено в заголовочном файле <cmath>
(1)
float logb ( float num ) ;

double logb ( double num ) ;

long double logb ( long double num ) ;
(до C++23)
constexpr /*floating-point-type*/
logb ( /*floating-point-type*/ num ) ;
(начиная с C++23)
float logbf ( float num ) ;
(2) (начиная с C++11)
(constexpr начиная с C++23)
long double logbl ( long double num ) ;
(3) (начиная с C++11)
(constexpr начиная с C++23)
SIMD перегрузка (начиная с C++26)
Определено в заголовочном файле <simd>
template < /*math-floating-point*/ V >

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

logb ( const V & v_num ) ;
(S) (начиная с C++26)
Определено в заголовочном файле <cmath>
template < class Integer >
double logb ( Integer num ) ;
(A) (constexpr начиная с C++23)
1-3) Извлекает значение несмещенного независимого от основания системы счисления экспоненты из аргумента с плавающей точкой num и возвращает его как значение с плавающей точкой. Библиотека предоставляет перегрузки std::logb для всех cv-неквалифицированных типов с плавающей точкой в качестве типа параметра. (since C++23)
S) Перегрузка SIMD выполняет поэлементное вычисление std::logb для v_num .
(См. math-floating-point и deduced-simd-t для их определений.)
(since C++26)
A) Дополнительные перегрузки предоставляются для всех целочисленных типов, которые трактуются как double .
(since C++11)

Формально, несмещённая экспонента — это знаковая целая часть log r |num| (возвращаемая этой функцией как значение с плавающей точкой), для ненулевого num , где r это std:: numeric_limits < T > :: radix и T — тип с плавающей точкой для num . Если num является денормализованным, он обрабатывается как нормализованный.

Содержание

Параметры

num - значение с плавающей точкой или целое число

Возвращаемое значение

Если ошибок не возникает, несмещённая экспонента num возвращается в виде знакового значения с плавающей запятой.

Если происходит ошибка домена, возвращается значение, определяемое реализацией.

Если возникает ошибка полюса, -HUGE_VAL , -HUGE_VALF , или -HUGE_VALL возвращается.

Обработка ошибок

Ошибки сообщаются, как указано в math_errhandling .

Ошибка области определения или диапазона может возникнуть, если num равен нулю.

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),

  • Если num равен ±0, возвращается -∞ и возбуждается FE_DIVBYZERO .
  • Если num равен ±∞, возвращается +∞.
  • Если num равен NaN, возвращается NaN.
  • Во всех остальных случаях результат является точным ( FE_INEXACT никогда не возбуждается) и текущий режим округления игнорируется.

Примечания

POSIX требует возникновения ошибки полюса, если num равен ±0.

Значение экспоненты, возвращаемое функцией std::logb , всегда на 1 меньше экспоненты, возвращаемой функцией std::frexp , из-за различных требований к нормализации: для экспоненты e , возвращаемой функцией std::logb , |num*r -e
|
находится между 1 и r (обычно между 1 и 2 ), но для экспоненты e , возвращаемой функцией std::frexp , |num*2 -e
|
находится между 0.5 и 1 .

Дополнительные перегрузки не обязаны быть предоставлены в точности как (A) . Они лишь должны быть достаточными для обеспечения того, чтобы для их аргумента num целочисленного типа, std :: logb ( num ) имел тот же эффект, что и std :: logb ( static_cast < double > ( num ) ) .

Пример

Сравнивает различные функции декомпозиции чисел с плавающей запятой:

#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";
}

Возможный вывод:

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

Смотрите также

(C++11) (C++11)
разлагает число на мантиссу и показатель степени по основанию 2
(функция)
(C++11) (C++11) (C++11)
извлекает показатель степени числа
(функция)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
умножает число на FLT_RADIX возведённое в степень
(функция)