Spec-Zone.ru › C

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)
1-3) Извлекает значение несмещённого, независимого от основания, показателя степени из аргумента с плавающей точкой arg, и возвращает его как значение с плавающей точкой.
4) Универсальные макросы типов: Если 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)

См. также

frexpfrexpffrexpl
(C99)(C99)
разложение числа на мантиссу и степень 2
(функция)
ilogbilogbfilogbl
(C99)(C99)(C99)
извлечение показателя степени заданного числа
(функция)
scalbnscalbnfscalbnlscalblnscalblnfscalblnl
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API