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 起) |
ilogbl
。否則,如果 arg 具有整數型別或型別 double,則呼叫 ilogb
。否則,呼叫 ilogbf
。形式上,對於非零的 arg,無偏指數是 logr|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),
- 如果正確結果大於 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
返回的指數值總是比 frexp 返回的指數值小 1,因為歸一化要求不同:對於 ilogb
返回的指數 e
,|arg*r-e
| 介於 1 和 r
之間(通常介於 1 和 2 之間),但對於 frexp 返回的指數 e
,|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> (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)
[編輯] 另請參閱
(C99)(C99) |
將一個數字分解為有效數字和2的冪 (函式) |
(C99)(C99)(C99) |
提取給定數字的指數 (函式) |
(C99)(C99)(C99)(C99)(C99)(C99) |
高效計算一個數字乘以 FLT_RADIX 的冪 (函式) |
C++ 文件 for ilogb
|