std:: ilogb, std:: ilogbf, std:: ilogbl
|
Определено в заголовке
<cmath>
|
||
| (1) | ||
|
int
ilogb
(
float
num
)
;
int
ilogb
(
double
num
)
;
|
(начиная с 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) |
std::ilogb
для всех cv-неквалифицированных типов с плавающей точкой в качестве типа параметра
num
.
(начиная с C++23)
Формально, несмещённая экспонента представляет собой целочисленную часть
log
r
|num|
в виде знакового целочисленного значения для ненулевого
num
, где
r
равно
std::
numeric_limits
<
T
>
::
radix
, а
T
— это тип с плавающей запятой для
num
.
Содержание |
Параметры
| num | - | значение с плавающей точкой или целочисленное значение |
Возвращаемое значение
Если ошибок не возникает, несмещённая экспонента num возвращается в виде значения со знаком 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
Смотрите также
|
(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
возведённое в степень
(функция) |
|
Документация C
для
ilogb
|
|