std::ilogb, std::ilogbf, std::ilogbl
Определено в заголовке <cmath> | ||
|---|---|---|
| (1) | ||
int ilogb ( float num ); int ilogb ( double num ); int ilogb ( long 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) |
num, и возвращает его как значение целого числа со знаком. Библиотека предоставляет перегрузки std::ilogb для всех типов с плавающей точкой без квалификаторов cv, как тип параметра num.(с C++23)
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См. также
|
(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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/math/ilogb