嵌入式學科:float
時(shi)間:2018-12-24 來源:華清遠(yuan)見
linux C 中(zhong)用(yong)float和(he)double 表(biao)(biao)示浮點(dian)數(shu),在32位(wei)電腦(nao)中(zhong) float 占4字節(jie),double占8字節(jie)(可以(yi)使用(yong)printf(“%u %u \n”, (unsined int)sizeof(float), (unsined int)sizeof(double)); 語句來(lai)測(ce)試兩個數(shu)據類型(xing)占的(de)內(nei)存(cun)(cun)空間(jian)大(da)小)。那么具(ju)體float他(ta)能表(biao)(biao)示的(de)數(shu)值(zhi)取值(zhi)范圍(wei)是多少呢?大(da)家知道(dao) int 整型(xing)在計算機中(zhong)是以(yi)補碼(ma)的(de)形式(shi)存(cun)(cun)儲(chu),取值(zhi)范圍(wei)是(-2147483648 ~ 2147483647),取值(zhi)范圍(wei)和(he)他(ta)在內(nei)存(cun)(cun)中(zhong)的(de)表(biao)(biao)示方(fang)式(shi)有直接的(de)關系。
C語言中的浮(fu)點(dian)數(shu)遵循(xun)IEEE(美國電氣和(he)電子工(gong)程師學會)二進制(zhi)浮(fu)點(dian)數(shu)算(suan)術標(biao)(biao)準(zhun)(IEEE754)是(shi)(shi)20世紀80年代以(yi)(yi)來最廣泛使用(yong)的浮(fu)點(dian)數(shu)運算(suan)標(biao)(biao)準(zhun)。如(ru)(ru)果知道float 在內存(cun)是(shi)(shi)如(ru)(ru)何利用(yong)4個(ge)(ge)字節(jie)的內存(cun)空間的,那么就知道float他的取值(zhi)(zhi)范(fan)圍了。Float是(shi)(shi)有符號(hao)(hao)數(shu),它在內存(cun)中是(shi)(shi)以(yi)(yi)符號(hao)(hao)位(wei)、指數(shu)位(wei)和(he)尾數(shu)位(wei)三個(ge)(ge)部分的形式(shi)進行存(cun)儲的。其中最高位(wei)表(biao)示符號(hao)(hao)位(wei)占(zhan)1bit表(biao)示正負,緊跟其后的8位(wei)表(biao)示指數(shu)部分以(yi)(yi)無符號(hao)(hao)形式(shi)存(cun)儲所(suo)以(yi)(yi)取值(zhi)(zhi)范(fan)圍是(shi)(shi)0-255,,剩余的23位(wei)表(biao)示尾數(shu)位(wei) :
第31比特位:1bit(符號(hao)位S)
第30到(dao)23比(bi)特(te)位(wei) 8bits(指(zhi)數位(wei)P)
第22到0 比特位(wei) 23bits(尾(wei)數位(wei)M)

表示公式: v = ((-1)^S)*(2(P-126))*(0.M)
S是符號位,只有0和1,分別表示正負。
P是階(jie)碼(ma)(ma)(ma),通常使(shi)用(yong)移碼(ma)(ma)(ma)表(biao)(biao)示(shi)(移碼(ma)(ma)(ma)和補(bu)碼(ma)(ma)(ma)只有符號位相反,其余都一(yi)樣(yang)。對(dui)于(yu)正數(shu)(shu)(shu)(shu)而言,原碼(ma)(ma)(ma)、反碼(ma)(ma)(ma)和補(bu)碼(ma)(ma)(ma)都一(yi)樣(yang);對(dui)于(yu)負數(shu)(shu)(shu)(shu)而言,補(bu)碼(ma)(ma)(ma)就(jiu)是其絕對(dui)值(zhi)的(de)(de)原碼(ma)(ma)(ma)全部取(qu)反,然(ran)后(hou)加(jia)1)。階(jie)碼(ma)(ma)(ma)可(ke)(ke)以為(wei)(wei)正數(shu)(shu)(shu)(shu),也可(ke)(ke)以為(wei)(wei)負數(shu)(shu)(shu)(shu),為(wei)(wei)了(le)處理負指數(shu)(shu)(shu)(shu)的(de)(de)情況,實(shi)(shi)際的(de)(de)指數(shu)(shu)(shu)(shu)值(zhi)按要求需要加(jia)上(shang)一(yi)個偏(pian)差(cha)(cha)(Bias)值(zhi)作為(wei)(wei)保(bao)存在指數(shu)(shu)(shu)(shu)域(yu)中(zhong)的(de)(de)值(zhi),單(dan)精(jing)度(du)數(shu)(shu)(shu)(shu)的(de)(de)偏(pian)差(cha)(cha)值(zhi)為(wei)(wei)127,雙精(jing)度(du)數(shu)(shu)(shu)(shu)的(de)(de)偏(pian)差(cha)(cha)值(zhi)為(wei)(wei)1023。例如,單(dan)精(jing)度(du)的(de)(de)實(shi)(shi)際指數(shu)(shu)(shu)(shu)值(zhi)0在指數(shu)(shu)(shu)(shu)域(yu)中(zhong)將保(bao)存為(wei)(wei)127,而保(bao)存在指數(shu)(shu)(shu)(shu)域(yu)中(zhong)的(de)(de)64則表(biao)(biao)示(shi)實(shi)(shi)際的(de)(de)指數(shu)(shu)(shu)(shu)值(zhi)-63,偏(pian)差(cha)(cha)的(de)(de)引入使(shi)得對(dui)于(yu)單(dan)精(jing)度(du)數(shu)(shu)(shu)(shu),實(shi)(shi)際可(ke)(ke)以表(biao)(biao)達(da)的(de)(de)指數(shu)(shu)(shu)(shu)值(zhi)的(de)(de)范圍就(jiu)變成-127到(dao)128之間(包含兩端(duan))。
M為尾(wei)數(shu)(shu),其中單精(jing)度數(shu)(shu)為23位長(chang),雙精(jing)度數(shu)(shu)為52位長(chang)。IEEE標準要求(qiu)浮 點(dian)數(shu)(shu)必須(xu)是規(gui)范的(de)(de)(de)(de)。這(zhe)意味(wei)著尾(wei)數(shu)(shu)的(de)(de)(de)(de)小數(shu)(shu)點(dian)左(zuo)側必須(xu)為1,因(yin)此(ci)在(zai)保(bao)(bao)存尾(wei)數(shu)(shu)的(de)(de)(de)(de)時候(hou),可(ke)以省略(lve)小數(shu)(shu)點(dian)前面這(zhe)個1,從(cong)而騰出一個二(er)進制(zhi)位來保(bao)(bao)存更多的(de)(de)(de)(de)尾(wei)數(shu)(shu)。這(zhe)樣實 際上用23位長(chang)的(de)(de)(de)(de)尾(wei)數(shu)(shu)域表達(da)(da)了24位的(de)(de)(de)(de)尾(wei)數(shu)(shu)。例如對(dui)于單精(jing)度數(shu)(shu)而言,二(er)進制(zhi)的(de)(de)(de)(de)1001.101(對(dui)應于十進制(zhi)的(de)(de)(de)(de)9.625)可(ke)以表達(da)(da)為1.001101 × 23,所以實際保(bao)(bao)存在(zai)尾(wei)數(shu)(shu)域中的(de)(de)(de)(de)值(zhi)為00110100000000000000000,即去掉小數(shu)(shu)點(dian)左(zuo)側的(de)(de)(de)(de)1,并用0在(zai)右側補(bu)齊。

浮(fu)點數的表(biao)示約定
單精度(du)(du)浮點(dian)數和雙精度(du)(du)浮點(dian)數都是(shi)用IEEE 754標準定義的,其中有一(yi)些特殊約(yue)定,例如:
1、當P=0,M=0時,表示0。
2、當P=255,M=0時,表(biao)示無(wu)窮(qiong)大(da)(da),用符號位(wei)來確定(ding)是(shi)正無(wu)窮(qiong)大(da)(da)還是(shi)負無(wu)窮(qiong)大(da)(da)。
3、當(dang)P=255,M≠0時,表示NaN(Not a Number,不(bu)是(shi)一個數)。
等等。。。
將二進制(zhi)(zhi)轉換為 十進制(zhi)(zhi)浮點數 單精度(du)
例子:
0x00280000
轉換成二進制
00000000001010000000000000000000
符(fu)號位 指數部(bu)分(8位) 尾數部(bu)分
0 00000000 01010000000000000000000
符(fu)號位=0;因指(zhi)數部(bu)分=0,則(ze):尾數部(bu)分M為:
0.01010000000000000000000=0.3125
該浮(fu)點(dian)數的十進制為:
(-1)^0*2^(-126)*0.3125
=3.6734198463196484624023016788195e-39

標準文檔 //754r.ucbtest.org/web-2008/drafts/archive/2006-10-04.pdf