IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754)是20世紀(jì)80年代以來(lái)最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number)),一些特殊數(shù)值(無(wú)窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算符”;它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時(shí)機(jī)與處理方式)。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、沙灣網(wǎng)站維護(hù)、網(wǎng)站推廣。IEEE 754規(guī)定了四種表示浮點(diǎn)數(shù)值的方式:?jiǎn)尉_度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實(shí)現(xiàn))。只有32位模式有強(qiáng)制要求,其他都是選擇性的。大部分編程語(yǔ)言都有提供IEEE浮點(diǎn)數(shù)格式與算術(shù),但有些將其列為非必需的。例如,IEEE 754問(wèn)世之前就有的C語(yǔ)言,有包括IEEE算術(shù),但不算作強(qiáng)制要求(C語(yǔ)言的float通常是指IEEE單精確度,而double是指雙精確度)。
該標(biāo)準(zhǔn)的全稱(chēng)為IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(ANSI/IEEE Std 754-1985),又稱(chēng)IEC 60559:1989,微處理器系統(tǒng)的二進(jìn)制浮點(diǎn)數(shù)算術(shù)(本來(lái)的編號(hào)是IEC 559:1989)。后來(lái)還有“與基數(shù)無(wú)關(guān)的浮點(diǎn)數(shù)”的“IEEE 854-1987標(biāo)準(zhǔn)”,有規(guī)定基數(shù)為2跟10的狀況。最新標(biāo)準(zhǔn)是“ISO/IEC/IEEE FDIS 60559:2010”。
這里我們用32位機(jī)器來(lái)講述
總體來(lái)說(shuō),浮點(diǎn)數(shù)我們可以用(-1)* S * M * 2 ^ E 來(lái)表示。
其中S表示符號(hào)位,當(dāng)S為0,即正數(shù),S為1即負(fù)數(shù),要注意的是S只有一個(gè)比特位的大小。
M表示有效數(shù)字,他是一個(gè)大于1小于二的數(shù),M的大小就是23個(gè)比特位。
2 ^ E表示指數(shù)位。E是一個(gè)無(wú)符號(hào)的整型,大小為8個(gè)比特位。
可以用一個(gè)圖來(lái)表示
因?yàn)镋是一個(gè)8bit位的無(wú)符號(hào)整數(shù),他的取值范圍就是0-255.但是科學(xué)計(jì)數(shù)法中E可以為負(fù)數(shù)的,
所以在將E存入內(nèi)存時(shí)要加上一個(gè)中間值,8位的中間值是127,所以當(dāng)E存入內(nèi)存前都要加127。
M存入內(nèi)存的有23個(gè)bit位,因?yàn)樗拇笮∈谴笥?小于2的,所以我們存進(jìn)去的值是小數(shù)點(diǎn)后的數(shù),
不存1,這樣我們存的位相當(dāng)于24位,利用的空間更大,當(dāng)取出來(lái)時(shí)再加上1即可。
下面我們用5.5為例,解釋一下:
5.5在用二進(jìn)制表示為101.1(其中101表示5,.1表示2的-1次方,也就是二分之一\0.5)
(-1) * 0 * 1.011 * 2 ^ 2? (0表示S,1.011表示M,E表示2)
那么我們將他存入內(nèi)存是怎么樣的呢?
可以看到,5.5是正數(shù),符號(hào)位是0,101.1要變成大于1小于2的數(shù)字,就要向前移動(dòng)兩位,E就是2
再加上127就是129,129的二進(jìn)制就是上圖所示,101.1向前移動(dòng)兩位就是1.011,將小數(shù)點(diǎn)后的數(shù)
存入M,不足23位補(bǔ)0,所以M也就如上圖所示。
再用一個(gè)題來(lái)加深印象。
int main()
{
int a = 9;
float* pa = &a;
printf("%d\n", a);
printf("%f\n", *pa);
*pa = 9.0f;
printf("%d\n", a);
printf("%f\n", *pa);
return 0;
}
這里可以看到打印的值不一樣,分析一下。
①:a為整型,用%d打印,輸出結(jié)果是9,這個(gè)沒(méi)問(wèn)題。
②:把a(bǔ)的地址取出放入float指針變量pa里,為什么打印出來(lái)的是0呢?
9的二進(jìn)制表示就是? ? 00000000000000000000000000001001
我們用浮點(diǎn)數(shù)來(lái)取出這個(gè)內(nèi)存,會(huì)認(rèn)為第一位是符號(hào)位,為0,第二到第九位是指數(shù)位,也是0
(有個(gè)知識(shí)點(diǎn):當(dāng)E的值位全0時(shí),表示這個(gè)數(shù)是1.XXXX 乘上2的-128次方,此時(shí)這個(gè)數(shù)是有個(gè)無(wú)限接近與0的數(shù),于是標(biāo)準(zhǔn)規(guī)定,M取出時(shí)不再加1,因?yàn)樗呀?jīng)無(wú)限接近0了,加不加已經(jīng)沒(méi)意義了。當(dāng)E的值為全1時(shí),這個(gè)數(shù)是個(gè)正負(fù)無(wú)窮大的數(shù),正號(hào)負(fù)號(hào)由符號(hào)位來(lái)決定,因?yàn)?.XXXX乘上2的127次方是一個(gè)很大的數(shù)。)
所以打印出來(lái)的結(jié)果就是0.000000;
③:已經(jīng)通過(guò)pa解引用將a的值改為9.0,那么再解引用得到9.00000也可以理解。
④:再通過(guò)整型來(lái)輸出,那么此時(shí)內(nèi)存里的a的二進(jìn)制是0 10000010 00100000000000000000000
我們用整型來(lái)輸出,會(huì)認(rèn)為這個(gè)是一個(gè)正數(shù),正數(shù)的原反補(bǔ)碼一樣,就會(huì)將這個(gè)數(shù)直接輸出。
下面我們?cè)偻ㄟ^(guò)內(nèi)存來(lái)觀察一下。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱(chēng):浮點(diǎn)數(shù)在內(nèi)存是如何存儲(chǔ)的-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.rwnh.cn/article38/ddsjsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、靜態(tài)網(wǎng)站、建站公司、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容