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) |
arg и возвращает его в виде знакового целочисленного значения.arg имеет тип long double, вызывается ilogbl. В противном случае, если arg имеет целочисленный тип или тип double, вызывается ilogb. В противном случае вызывается ilogbf.INT_MIN, либо -INT_MAX.INT_MIN, либо +INT_MAX.Формально смещённый экспонент — это целая часть logr|arg|, представленная в виде знакового целого значения для ненулевого arg, где r — это FLT_RADIX.
Параметры
| arg | - | значение с плавающей точкой |
Возвращаемое значение
Если ошибок не происходит, смещённый экспонент arg возвращается в виде значения типа signed int.
Если 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++ для ilogb |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/ilogb