資源描述:
《float的浮點(diǎn)表示法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌浮點(diǎn)表示法此教程為ITjob軟件開發(fā)教程網(wǎng)提供,特此分享,互相學(xué)習(xí)!float共計(jì)32位(4字節(jié))由最高到最低位分別是第31、30、29、......、0位31位是符號(hào)位,1表示該數(shù)為負(fù),0反之30~23位,一共8位是指數(shù)位(-128~127)22~0位,一共23位是尾數(shù)位每8位分為一組,分成4組,分別是A組、B組、C組、D組每一組是一個(gè)字節(jié),在內(nèi)存中逆序存儲(chǔ),即:DCBA??3130???2322???????????????????0??
2、-
3、--------
4、---------------------
5、--
6、??
7、
8、???????
9、??????????????????????
10、??
11、-
12、--------
13、----------------------
14、注:尾數(shù)的存儲(chǔ)位為23位,由于沒有存儲(chǔ)最高位的1,所以實(shí)際有效位為24位。如果其中20位都用來(lái)表示小數(shù)部分,能表示的最大值為0.999999???我們先不考慮逆序存儲(chǔ)的問(wèn)題,因?yàn)槟菢訒?huì)把讀者徹底搞暈,所以我先按照順序的來(lái)講,最后再把他們翻過(guò)來(lái)就行了。純整數(shù)的表示方法-------------------------------------------------???現(xiàn)在讓我們按照IEEE浮點(diǎn)數(shù)表示法,一步步的將float型浮
15、點(diǎn)數(shù)123456.0ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌f轉(zhuǎn)換為十六進(jìn)制代碼。在處理這種不帶小數(shù)的浮點(diǎn)數(shù)時(shí),直接將整數(shù)部123456轉(zhuǎn)化為二進(jìn)制表示:11110001001000000也可以這樣表示:11110001001000000.然后將小數(shù)點(diǎn)向左移,一直移到離最高位只有1位:1.1110001001000000一共移動(dòng)了16位,在布爾運(yùn)算中小數(shù)點(diǎn)每向左移一位就等于在以2為底的科學(xué)計(jì)算法表示中指數(shù)+1,所以原數(shù)就等于這樣11110001001000000=1.111000
16、1001000000*(2^16)現(xiàn)在我們要的尾數(shù)和指數(shù)都出來(lái)了。顯而易見,最高位永遠(yuǎn)是1,因?yàn)槟悴豢赡馨奄I了16個(gè)雞蛋說(shuō)成是買了0016個(gè)雞蛋吧?(呵呵,可別拿你買的臭雞蛋甩我),所以這個(gè)1我們還有必要保留他嗎?(眾:沒有!)好的,我們刪掉他。這樣尾數(shù)的二進(jìn)制就變成了:1110001001000000最后在尾數(shù)的后面補(bǔ)0,一直到補(bǔ)夠23位:11100010010000000000000(MD,這些個(gè)0差點(diǎn)沒把我數(shù)的背過(guò)氣去)???再回來(lái)看指數(shù)位30~23位,一共8位,可以表示范圍是0~255的無(wú)符號(hào)整數(shù),也可以表示-128~127的有符號(hào)整數(shù)。但因?yàn)橹笖?shù)是可以為負(fù)的,所以
17、為了統(tǒng)一把十進(jìn)制的整數(shù)化為二進(jìn)制時(shí),都先加上127。???在這里,我們的16加上127后就變成了143,二進(jìn)制表示為:10001111123456.0f這個(gè)數(shù)是正的,所以符號(hào)位是0,那么我們按照前面講的格式把它拼起來(lái):ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌0100011111110001001000000000000001000111111100010010000000000000再轉(zhuǎn)化為16進(jìn)制為:47F12000,最后把它翻過(guò)來(lái),就成了:0020F147輸出4個(gè)字節(jié)的浮點(diǎn)數(shù)
18、內(nèi)存數(shù)據(jù)-------------------------------------------------#includeintmain(){floatf=123456.0;unsignedchar*c=(unsignedchar*)&f;for(inti=3;i>=0;i--){printf("%p",c[i]);}}0x470xf10x20(nil)整數(shù)和小數(shù)混合的表示方法-------------------------------------------------???有了上面的基礎(chǔ)后,下面我再舉一個(gè)帶小數(shù)的例子來(lái)看一下為什么會(huì)出現(xiàn)精度問(wèn)題。
19、???按照IEEE浮點(diǎn)數(shù)表示法,將float型浮點(diǎn)數(shù)123.456f轉(zhuǎn)換為十六進(jìn)制代碼。對(duì)于這種帶小數(shù)的就需要把整數(shù)部和小數(shù)部分開處理。整數(shù)部直接化二進(jìn)制:ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌ITjob就業(yè)培訓(xùn),九年一劍,100%就業(yè)率打造IT培訓(xùn)行業(yè)第一品牌1111011。小數(shù)部的處理比較麻煩一些,也不太好講,可能反著講效果好一點(diǎn),比如有一個(gè)十進(jìn)制純小數(shù)0.57826,那么5是十分位,位階是1/10;7是百分位,位階是1/100;8是千分位,位階是1/1000...,這些位階分母的