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.

Формально несмещённый показатель степени — это знаковая целая часть logr|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)

См. также

frexpfrexpffrexpl
(C99)(C99)
разбивает число на мантиссу и степень двойки
(функция)
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/c/numeric/math/logb

Spec-Zone.ru

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