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) |
arg, и возвращает его как значение с плавающей точкой. arg имеет тип long double, вызывается logbl. В противном случае, если arg имеет целочисленный тип или тип double, вызывается logb. В противном случае, вызывается logbf. Формально, несмещённый показатель степени — это целая часть с знаком логарифма по основанию r модуля аргумента (возвращаемого этой функцией как значение с плавающей точкой), для ненулевого аргумента, где 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 <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.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Ссылки
- Стандарт 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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/logb