溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

深度剖析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)2——浮點(diǎn)數(shù)數(shù)在內(nèi)存中的存儲(chǔ)

發(fā)布時(shí)間:2020-06-25 22:24:21 來源:網(wǎng)絡(luò) 閱讀:201 作者:flag不會(huì)倒 欄目:編程語言

根據(jù)國際標(biāo)準(zhǔn)IEEE:任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示為下面形式:
(-1)^SM2^E:
(-1)^S表示符號(hào)位,當(dāng)S為0,V為正數(shù);當(dāng)S為1,V為負(fù)數(shù)。由其物理結(jié)構(gòu)決定了,浮點(diǎn)數(shù)為有符號(hào)數(shù)。
M為有效數(shù)字,大于等于1,小于2。
2^E表示指數(shù)位。
eg:5=>0101=>(-1)^01.012^2. S=0,M=1.01,E=2
規(guī)定:對(duì)于32位的浮點(diǎn)數(shù)(單精度浮點(diǎn)數(shù)存儲(chǔ)),最高1位是符號(hào)位(S),接著的8位為指數(shù)位(E),剩下的23位是有效數(shù)字位(M),不滿23位后面補(bǔ)0。
對(duì)于64位的浮點(diǎn)數(shù)(雙精度浮點(diǎn)數(shù)存儲(chǔ)),最高1位是符號(hào)位(S),接著的11位為指數(shù)位(E),剩下的52位是有效數(shù)字位(M)。
對(duì)于有效數(shù)字M和指數(shù)E會(huì)有一些特殊規(guī)定:
1、因?yàn)?<=M<2,所以小數(shù)點(diǎn)前必定是1,所以可以省略1和小數(shù)點(diǎn),這樣一來,對(duì)于單精度浮點(diǎn)數(shù)存儲(chǔ)方式,23位有效數(shù)位存的都是小數(shù)部份數(shù)。讀取時(shí),小數(shù)點(diǎn)和1都會(huì)被自動(dòng)加上。等于可以保留24位有效數(shù)字。雙精度同理。
2、對(duì)于指數(shù)E來說,首先說明他是一個(gè)無符號(hào)整數(shù),對(duì)于單精度浮點(diǎn)數(shù)存儲(chǔ)方式,E共占8位,則E的取值范圍為0~255。但是科學(xué)記數(shù)法中,指數(shù)是可以為負(fù)數(shù)的,所以規(guī)定,存入內(nèi)存時(shí),E的真實(shí)值必須加上一個(gè)中間數(shù),對(duì)于8位的E,這個(gè)中間數(shù)為(255/2=)127(實(shí)際表達(dá)范圍-127~128),對(duì)于11位的E,這個(gè)中間數(shù)為1023(實(shí)際表達(dá)范圍-1023~1024)。取數(shù)時(shí),再減去127/1023即為實(shí)際值。(移碼)
eg. 由上面可知,5的指數(shù)為2,對(duì)于單精度浮點(diǎn)數(shù)存儲(chǔ)方式,實(shí)際在內(nèi)存中存儲(chǔ)的數(shù)為127+2=129=>1000 0001。
注意:因?yàn)楫?dāng)E為全零時(shí),實(shí)際上指數(shù)為-127,表示一個(gè)接近零很小的數(shù),因此浮點(diǎn)數(shù)不能與零比較,用精度來代替。當(dāng)E為全一時(shí),表示的±無窮大。
綜述:整數(shù)與浮點(diǎn)數(shù)的存儲(chǔ)方式完全不同,整數(shù)存取為原反補(bǔ)碼,浮點(diǎn)數(shù)為S、E、M
練習(xí)代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
    int n = 9;                        //0000 0000 0000 0000 0000 0000 0000 1001
    float pFloat = (float)n;          //將9取出,轉(zhuǎn)為浮點(diǎn)型,再存給pFloat
    float *pfloat = (float *)&n;      //將n的地址轉(zhuǎn)為浮點(diǎn)數(shù)地址(即看待n的方式變?yōu)楦↑c(diǎn)數(shù))。
    printf("n=%d\n", n);
    printf("pFloat=%f\n", pFloat);
    printf("*float=%f\n", *pfloat);   //解引用后以浮點(diǎn)數(shù)形式看待空間里的值  0 00000000 00000000000000000001001   S=0,E=0,(-127)
    *pfloat = 9.0;                    //1001 實(shí)際n空間中存的值0 00000011 00100000000000000001001 
    printf("n=%d\n", n);              //轉(zhuǎn)換為整數(shù)為 1091567616
    printf("*float=%f\n", *pfloat);   // 9.000000
    system("pause");
    return 0;
}
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI