ilogb, ilogbf, ilogbl
|
Определено в заголовке
<math.h>
|
||
|
int
ilogbf
(
float
arg
)
;
|
(1) | (начиная с C99) |
|
int
ilogb
(
double
arg
)
;
|
(2) | (начиная с C99) |
|
int
ilogbl
(
long
double
arg
)
;
|
(3) | (начиная с C99) |
|
Определено в заголовке
<tgmath.h>
|
||
|
#define ilogb( arg )
|
(4) | (начиная с C99) |
|
Определено в заголовке
<math.h>
|
||
|
#define FP_ILOGB0 /* implementation-defined */
|
(5) | (начиная с C99) |
|
#define FP_ILOGBNAN /* implementation-defined */
|
(6) | (начиная с C99) |
ilogbl
вызывается. В противном случае, если
arg
имеет целочисленный тип или тип
double
,
ilogb
вызывается. В противном случае
ilogbf
вызывается.
Формально, несмещённая экспонента — это целая часть
log
r
|arg|
как знаковое целочисленное значение, для ненулевого
arg
, где
r
это
FLT_RADIX
.
Содержание |
Параметры
| arg | - | значение с плавающей запятой |
Возвращаемое значение
Если ошибок не возникает, несмещённая экспонента arg возвращается в виде знакового целого числа.
Если arg равен нулю, FP_ILOGB0 возвращается.
Если arg бесконечен, INT_MAX возвращается.
Если arg является NaN, FP_ILOGBNAN возвращается.
Если правильный результат больше INT_MAX или меньше INT_MIN , возвращаемое значение не определено и может возникнуть ошибка домена или ошибка диапазона.
Обработка ошибок
Ошибки сообщаются, как указано в
math_errhandling
.
Ошибка домена или ошибка диапазона может возникнуть, если arg равен нулю, бесконечности или NaN.
Если правильный результат больше INT_MAX или меньше INT_MIN , может возникнуть ошибка домена или ошибка диапазона
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- Если правильный результат больше INT_MAX или меньше INT_MIN , возбуждается FE_INVALID .
- Если arg равен ±0, ±∞ или NaN, возбуждается FE_INVALID .
- Во всех остальных случаях результат является точным ( FE_INEXACT никогда не возбуждается) и текущий режим округления игнорируется.
Примечания
Если arg не является нулём, бесконечностью или NaN, возвращаемое значение точно эквивалентно ( int ) logb ( arg ) .
POSIX требует возникновения ошибки домена, если arg равен нулю, бесконечности, NaN, или если правильный результат выходит за пределы диапазона int .
POSIX также требует, чтобы в XSI-совместимых системах значение, возвращаемое когда правильный результат больше INT_MAX , было равно INT_MAX , а значение, возвращаемое когда правильный результат меньше INT_MIN , было равно INT_MIN .
Правильный результат может быть представлен как int во всех известных реализациях. Для возникновения переполнения INT_MAX должно быть меньше LDBL_MAX_EXP * log2 ( FLT_RADIX ) или INT_MIN должно быть больше LDBL_MIN_EXP - LDBL_MANT_DIG ) * log2 ( FLT_RADIX ) .
Значение экспоненты, возвращаемое функцией
ilogb
, всегда на 1 меньше экспоненты, возвращаемой функцией
frexp
, из-за различных требований к нормализации: для экспоненты
e
, возвращаемой функцией
ilogb
,
|arg*r
-e
|
находится в диапазоне от 1 до
r
(обычно между
1
и
2
), но для экспоненты
e
, возвращаемой функцией
frexp
,
|arg*2
-e
|
находится в диапазоне от
0.5
до
1
.
Пример
#include <fenv.h> #include <float.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { double f = 123.45; printf("Given the number %.2f or %a in hex,\n", f, f); double f3; double f2 = modf(f, &f3); printf("modf() makes %.0f + %.2f\n", f3, f2); int i; f2 = frexp(f, &i); printf("frexp() makes %f * 2^%d\n", f2, i); i = ilogb(f); printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // error handling feclearexcept(FE_ALL_EXCEPT); printf("ilogb(0) = %d\n", ilogb(0)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID raised"); }
Возможный вывод:
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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.12/8 Математика <math.h> (стр.: TBD)
-
- 7.12.6.5 Функции ilogb (стр.: TBD)
-
- 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
-
- F.10.3.5 Функции ilogb (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.12/8 Математика <math.h> (стр.: TBD)
-
- 7.12.6.5 Функции ilogb (стр.: TBD)
-
- 7.25 Обобщенная математика <tgmath.h> (стр.: TBD)
-
- F.10.3.5 Функции ilogb (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.12/8 Математика <math.h> (стр: 232)
-
- 7.12.6.5 Функции ilogb (стр: 244)
-
- 7.25 Обобщенная математика типов <tgmath.h> (стр: 373-375)
-
- F.10.3.5 Функции ilogb (стр: 521)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.12/8 Математика <math.h> (стр: 213)
-
- 7.12.6.5 Функции ilogb (стр: 224-225)
-
- 7.22 Обобщенная математика типов <tgmath.h> (стр: 335-337)
-
- F.9.3.5 Функции ilogb (стр: 458)
Смотрите также
|
(C99)
(C99)
|
разбивает число на мантиссу и степень
2
(функция) |
|
(C99)
(C99)
(C99)
|
извлекает экспоненту заданного числа
(функция) |
|
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
|
эффективно вычисляет число, умноженное на
FLT_RADIX
в степени
(функция) |
|
C++ documentation
для
ilogb
|
|