logb, logbf, logbl
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовке
<math.h>
|
||
|
float
logbf
(
float
arg
)
;
|
(1) | (начиная с C99) |
|
double
logb
(
double
arg
)
;
|
(2) | (начиная с C99) |
|
long
double
logbl
(
long
double
arg
)
;
|
(3) | (начиная с C99) |
|
Определено в заголовке
<tgmath.h>
|
||
|
#define logb( arg )
|
(4) | (начиная с C99) |
logbl
вызывается. В противном случае, если
arg
имеет целочисленный тип или тип
double
,
logb
вызывается. В остальных случаях
logbf
вызывается.
Формально, несмещённая экспонента — это знаковая целая часть
log
r
|arg|
(возвращаемая данной функцией как значение с плавающей точкой), для ненулевого
arg
, где
r
это
FLT_RADIX
. Если
arg
является денормализованным, он обрабатывается как нормализованный.
Содержание |
Параметры
| arg | - | значение с плавающей запятой |
Возвращаемое значение
Если ошибок не возникает, несмещённая экспонента arg возвращается в виде знакового значения с плавающей запятой.
Если возникает ошибка домена, возвращается значение, определяемое реализацией.
Если возникает ошибка полюса,
-HUGE_VAL
,
-HUGE_VALF
, или
-HUGE_VALL
возвращается.
Обработка ошибок
Ошибки сообщаются, как указано в
math_errhandling
.
Ошибка области определения или диапазона может возникнуть, если arg равен нулю.
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- Если arg равен ±0, возвращается -∞ и возбуждается FE_DIVBYZERO .
- Если arg равен ±∞, возвращается +∞.
- Если arg является NaN, возвращается NaN.
- Во всех остальных случаях результат является точным ( FE_INEXACT никогда не возбуждается) и текущий режим округления игнорируется.
Примечания
POSIX требует возникновения ошибки полюса, если arg равен ±0.
Значение экспоненты, возвращаемое функцией
logb
, всегда на
1
меньше, чем экспонента, возвращаемая функцией
frexp
, из-за различных требований к нормализации: для экспоненты
e
, возвращаемой функцией
logb
,
|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 = logb(f); printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // error handling feclearexcept(FE_ALL_EXCEPT); printf("logb(0) = %f\n", logb(0)); if (fetestexcept(FE_DIVBYZERO)) puts(" FE_DIVBYZERO raised"); }
Возможный вывод:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/logb() make 1.928906 * 2^6
logb(0) = -Inf
FE_DIVBYZERO raised
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.12.6.11 Функции logb (стр.: TBD)
-
- 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
-
- F.10.3.11 Функции logb (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.12.6.11 Функции logb (стр. 179-180)
-
- 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
-
- F.10.3.11 Функции logb (стр. 381)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.12.6.11 Функции logb (стр. 246)
-
- 7.25 Обобщённая математика <tgmath.h> (стр. 373-375)
-
- F.10.3.11 Функции logb (стр. 522)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.12.6.11 Функции logb (стр. 227)
-
- 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
-
- F.9.3.11 Функции logb (стр. 459)
Смотрите также
|
(C99)
(C99)
|
разбивает число на мантиссу и степень
2
(функция) |
|
(C99)
(C99)
(C99)
|
извлекает экспоненту заданного числа
(функция) |
|
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
|
эффективно вычисляет число, умноженное на
FLT_RADIX
в указанной степени
(функция) |
|
C++ документация
для
logb
|
|