?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
在頭文件<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 / *實(shí)現(xiàn)定義的* / | (5) | (自C99以來) |
#define FP_ILOGBNAN / *實(shí)現(xiàn)定義的* / | (6) | (自C99以來) |
1-3)從浮點(diǎn)參數(shù)arg中提取無偏指數(shù)的值,并將其作為有符號(hào)整數(shù)值返回。
4)類型通用宏:如果arg的類型是long double,則調(diào)用ilogbl。 否則,如果arg具有整數(shù)類型或類型double,則調(diào)用ilogb。 否則,調(diào)用ilogbf。
5)擴(kuò)展為整型常量表達(dá)式,其值為INT_MIN或-INT_MAX。
6)擴(kuò)展為整數(shù)常量表達(dá)式,其值為INT_MIN或+ INT_MAX。
形式上,無偏指數(shù)是log的組成部分
r|arg| 作為有符號(hào)整數(shù)值,用于非零arg,其中r是FLT_RADIX。
ARG | - | 浮點(diǎn)值 |
---|
如果沒有發(fā)生錯(cuò)誤,則arg的無偏指數(shù)將作為帶符號(hào)的int值返回。
如果arg為零,則返回FP_ILOGB0。
如果arg是無限的,則返回INT_MAX。
如果arg是NaN,則返回FP_ILOGBNAN。
如果正確結(jié)果大于INT_MAX或小于INT_MIN,則返回值未指定,并可能出現(xiàn)域錯(cuò)誤或范圍錯(cuò)誤。
按照math_errhandling中的指定報(bào)告錯(cuò)誤。
如果arg為零,無限或NaN,則可能會(huì)出現(xiàn)域錯(cuò)誤或范圍錯(cuò)誤。
如果正確結(jié)果大于INT_MAX或小于INT_MIN,則可能發(fā)生域錯(cuò)誤或范圍錯(cuò)誤。
如果實(shí)現(xiàn)支持IEEE浮點(diǎn)運(yùn)算(IEC 60559),
如果正確的結(jié)果大于INT_MAX或小于INT_MIN,則引發(fā)FE_INVALID。
如果arg為±0,±∞或NaN,則引發(fā)FE_INVALID。
在所有其他情況下,結(jié)果都是準(zhǔn)確的(FE_INEXACT從不會(huì)被提升),而當(dāng)前舍入模式將被忽略
如果arg不為零,無限或NaN,則返回的值完全等于(int)logb(arg)。
如果arg為零,無限,NaN,或者如果正確的結(jié)果超出了int范圍,則POSIX要求發(fā)生域錯(cuò)誤。
POSIX還要求在符合XSI的系統(tǒng)上,當(dāng)正確的結(jié)果大于INT_MAX時(shí)返回的值為INT_MAX,當(dāng)正確的結(jié)果小于INT_MIN時(shí)返回的值為INT_MIN。
在所有已知的實(shí)現(xiàn)中,正確的結(jié)果可以表示為int。 為了發(fā)生溢出,INT_MAX必須小于LDBL_MAX_EXP * log2(FLT_RADIX)或INT_MIN必須大于LDBL_MIN_EXP-LDBL_MANT_DIG)* log2(FLT_RADIX)。
std :: ilogb返回的指數(shù)的值總是比由frexp返回的指數(shù)小1,這是因?yàn)闅w一化要求不同:對于由ilogb返回的指數(shù)e,| arg * r-e
| 介于1和r之間(通常介于1和2之間),但對于由frexp返回的指數(shù)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標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.12 / 8數(shù)學(xué)<math.h>(p:232)
7.12.6.5 ilogb函數(shù)(p:244)
7.25類型通用數(shù)學(xué)<tgmath.h>(p:373-375)
F.10.3.5 ilogb函數(shù)(p:521)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.12 / 8數(shù)學(xué)<math.h>(p:213)
7.12.6.5 ilogb函數(shù)(p:224-225)
7.22類型通用數(shù)學(xué)<tgmath.h>(p:335-337)
F.9.3.5 ilogb函數(shù)(p:458)
frexpfrexpffrexpl(C99)(C99) | 將數(shù)字分為有效數(shù)和2(功能) |
---|---|
logblogbflogbl(C99)(C99)(C99) | 提取給定數(shù)字的指數(shù)(函數(shù)) |
scalbnscalbnfscalbnlscalblnscalblnfscalblnl(C99)(C99)(C99)(C99)(C99)(C99) | 有效計(jì)算FLT_RADIX提升到功率(功能)的次數(shù) |
| 用于ilogb的C ++文檔 |