?
This document uses PHP Chinese website manual Release
在頭文件<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 / *實現定義的* / | (5) | (自C99以來) |
#define FP_ILOGBNAN / *實現定義的* / | (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 | - | 浮點值 |
---|
如果沒有發(fā)生錯誤,則arg的無偏指數將作為帶符號的int值返回。
如果arg為零,則返回FP_ILOGB0。
如果arg是無限的,則返回INT_MAX。
如果arg是NaN,則返回FP_ILOGBNAN。
如果正確結果大于INT_MAX或小于INT_MIN,則返回值未指定,并可能出現域錯誤或范圍錯誤。
按照math_errhandling中的指定報告錯誤。
如果arg
為零,無限或NaN,則可能會出現域錯誤或范圍錯誤。
如果正確結果大于INT_MAX或小于INT_MIN,則可能發(fā)生域錯誤或范圍錯誤。
如果實現支持IEEE浮點運算(IEC 60559),
如果正確的結果大于INT_MAX或小于INT_MIN,則引發(fā)FE_INVALID。
如果arg為±0,±∞或NaN,則引發(fā)FE_INVALID。
在所有其他情況下,結果都是準確的(FE_INEXACT從不會被提升),而當前舍入模式將被忽略
如果arg不為零,無限或NaN,則返回的值完全等于(int)logb(arg)。
如果arg為零,無限,NaN,或者如果正確的結果超出了int范圍,則POSIX要求發(fā)生域錯誤。
POSIX還要求在符合XSI的系統(tǒng)上,當正確的結果大于INT_MAX時返回的值為INT_MAX,當正確的結果小于INT_MIN時返回的值為INT_MIN。
在所有已知的實現中,正確的結果可以表示為int。 為了發(fā)生溢出,INT_MAX必須小于LDBL_MAX_EXP * log2(FLT_RADIX)或INT_MIN必須大于LDBL_MIN_EXP-LDBL_MANT_DIG)* log2(FLT_RADIX)。
std :: ilogb返回的指數的值總是比由frexp返回的指數小1,這是因為歸一化要求不同:對于由ilogb返回的指數e,| arg * r-e
| 介于1和r之間(通常介于1和2之間),但對于由frexp返回的指數e,| arg * 2-e
| 介于0.5
和1
之間。
#include <stdio.h>#include <math.h>#include <float.h>#include <fenv.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.45frexp() makes 0.964453 * 2^7logb()/ilogb() make 1.92891 * 2^6ilogb(0) = -2147483648 FE_INVALID raised
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)
frexpfrexpffrexpl(C99)(C99) | 將數字分為有效數和2(功能) |
---|---|
logblogbflogbl(C99)(C99)(C99) | 提取給定數字的指數(函數) |
scalbnscalbnfscalbnlscalblnscalblnfscalblnl(C99)(C99)(C99)(C99)(C99)(C99) | 有效計算FLT_RADIX提升到功率(功能)的次數 |
| 用于ilogb的C ++文檔 |