Namespaces
Variants

ilogb, ilogbf, ilogbl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
(C99) (C99)
ilogb llogb
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
FP_ILOGB0 FP_ILOGBNAN
(C99) (C99)
FP_LLOGB0 FP_LLOGBNAN
(C23) (C23)
Error handling
Fast operation indicators
Определено в заголовке <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 .

Формально, несмещённая экспонента — это целая часть log r |arg| как знаковое целочисленное значение, для ненулевого arg , где r это FLT_RADIX .

Содержание

Параметры

arg - значение с плавающей запятой

Возвращаемое значение

Если ошибок не возникает, несмещённая экспонента arg возвращается в виде знакового целого числа.

Если 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),

Примечания

Если 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)

Смотрите также

разбивает число на мантиссу и степень 2
(функция)
(C99) (C99) (C99)
извлекает экспоненту заданного числа
(функция)
(C99) (C99) (C99) (C99) (C99) (C99)
эффективно вычисляет число, умноженное на FLT_RADIX в степени
(функция)
C++ documentation для ilogb