Spec-Zone.ru › C++

std::ilogb, std::ilogbf, std::ilogbl

Определено в заголовочном файле <cmath>
int ilogb ( float num );
int ilogb ( double num );
int ilogb ( long double num );
(1) (начиная с C++11)
(до C++23)
constexpr int ilogb( /* floating-point-type */ num );
(начиная с C++23)
int ilogbf( float num );
(2) (начиная с C++11)
(constexpr начиная с C++23)
int ilogbl( long double num );
(3) (начиная с C++11)
(constexpr начиная с C++23)
#define FP_ILOGB0   /* implementation-defined */
(4) (начиная с C++11)
#define FP_ILOGBNAN /* implementation-defined */
(5) (начиная с C++11)
Дополнительные перегрузки
Определено в заголовочном файле <cmath>
template< class Integer >
int ilogb ( Integer num );
(A) (начиная с C++11)
(constexpr начиная с C++23)
1-3) Извлекает значение несмещённого показателя из аргумента с плавающей точкой num и возвращает его в виде знакового целого значения. Библиотека предоставляет перегрузки std::ilogb для всех типов с плавающей точкой без cv-квалификаторов в качестве типа параметра num.(начиная с C++23)
4) Разворачивается в целочисленное константное выражение, значение которого равно либо INT_MIN, либо -INT_MAX.
5) Разворачивается в целочисленное константное выражение, значение которого равно либо INT_MIN, либо +INT_MAX.
A) Предоставляются дополнительные перегрузки для всех целочисленных типов, которые обрабатываются как double.

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

Параметры

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

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

Если ошибок не возникает, несмещённый показатель числа num возвращается в виде значения типа signed int.

Если num равно нулю, возвращается FP_ILOGB0.

Если num бесконечно, возвращается INT_MAX.

Если num является NaN, возвращается FP_ILOGBNAN.

Если правильный результат больше INT_MAX или меньше INT_MIN, возвращаемое значение не определено.

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

Об ошибках сообщается согласно спецификации math_errhandling.

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

Если правильный результат больше INT_MAX или меньше INT_MIN, может возникнуть ошибка области определения или ошибка диапазона.

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

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

Примечания

Если num не равно нулю, бесконечности или NaN, возвращаемое значение в точности эквивалентно static_cast<int>(std::logb(num)).

POSIX требует, чтобы ошибка области определения возникала, если num равно нулю, бесконечности или NaN либо если правильный результат выходит за пределы диапазона int.

POSIX также требует, чтобы в системах, соответствующих XSI, возвращаемое значение, если правильный результат больше INT_MAX, было равно INT_MAX, а возвращаемое значение, если правильный результат меньше INT_MIN, было равно INT_MIN.

Правильный результат может быть представлен типом int во всех известных реализациях. Переполнение возможно, только если INT_MAX меньше LDBL_MAX_EXP * std::log2(FLT_RADIX) или INT_MIN больше LDBL_MIN_EXP - LDBL_MANT_DIG) * std::log2(FLT_RADIX).

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

Дополнительные перегрузки не обязательно должны быть предоставлены в точности в виде (A). Они должны лишь обеспечивать, чтобы для аргумента num целочисленного типа std::ilogb(num) имела тот же эффект, что и std::ilogb(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 << "ilogb(0) = " << std::ilogb(0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID 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
ilogb(0) = -2147483648
    FE_INVALID raised

См. также

frexpfrexpffrexpl
(C++11)(C++11)
разбивает число на значащую часть и показатель степени по основанию 2
(функция)
logblogbflogbl
(C++11)(C++11)(C++11)
извлекает показатель степени числа
(функция)
scalbnscalbnfscalbnlscalblnscalblnfscalblnl
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
умножает число на FLT_RADIX в некоторой степени
(функция)
Документация по C для ilogb

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/math/ilogb

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API