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