名稱空間
變體
操作

ilogb、ilogbf、ilogbl

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指數函式
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
冪函式
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角函式和雙曲函式
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最近整數浮點數
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮點數操作
(C99)(C99)
ilogbllogb
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(C99)
(C99)
(C99)
(C23)
誤差函式和伽馬函式
(C99)
(C99)
(C99)
(C99)
型別
宏常量
特殊浮點值
(C99)(C23)
引數和返回值
FP_ILOGB0FP_ILOGBNAN
(C99)(C99)
FP_LLOGB0FP_LLOGBNAN
(C23)(C23)
錯誤處理
快速操作指示符
 
定義於標頭檔案 <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

形式上,對於非零的 arg,無偏指數是 logr|arg| 的整數部分作為帶符號整數值,其中 rFLT_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 返回的指數值總是比 frexp 返回的指數值小 1,因為歸一化要求不同:對於 ilogb 返回的指數 e|arg*r-e
|
介於 1 和 r 之間(通常介於 12 之間),但對於 frexp 返回的指數 e|arg*2-e
|
介於 0.51 之間。

[編輯] 示例

#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> (p: 待定)
  • 7.12.6.5 ilogb 函式 (p: 待定)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函式 (p: 待定)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.12/8 數學 <math.h> (p: 待定)
  • 7.12.6.5 ilogb 函式 (p: 待定)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函式 (p: 待定)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.12/8 數學 <math.h> (p: 232)
  • 7.12.6.5 ilogb 函式 (p: 244)
  • 7.25 型別通用數學 <tgmath.h> (p: 373-375)
  • F.10.3.5 ilogb 函式 (p: 521)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.12/8 數學 <math.h> (p: 213)
  • 7.12.6.5 ilogb 函式 (p: 224-225)
  • 7.22 型別通用數學 <tgmath.h> (p: 335-337)
  • F.9.3.5 ilogb 函式 (p: 458)

[編輯] 另請參閱

將一個數字分解為有效數字和2的冪
(函式) [編輯]
(C99)(C99)(C99)
提取給定數字的指數
(函式) [編輯]
(C99)(C99)(C99)(C99)(C99)(C99)
高效計算一個數字乘以 FLT_RADIX 的冪
(函式) [編輯]
C++ 文件 for ilogb