Spec-Zone.ru › C

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)
1-3) Извлекает значение смещённого экспонента из аргумента с плавающей точкой arg и возвращает его в виде знакового целочисленного значения.
4) Обобщённые макросы для типов: если arg имеет тип long double, вызывается ilogbl. В противном случае, если arg имеет целочисленный тип или тип double, вызывается ilogb. В противном случае вызывается ilogbf.
5) Разворачивается в целочисленное константное выражение, значение которого равно либо INT_MIN, либо -INT_MAX.
6) Разворачивается в целочисленное константное выражение, значение которого равно либо 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)

См. также

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

Spec-Zone.ru

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