您好,登錄后才能下訂單哦!
根據國際標準IEEE:任意一個二進制浮點數V可以表示為下面形式:
(-1)^SM2^E:
(-1)^S表示符號位,當S為0,V為正數;當S為1,V為負數。由其物理結構決定了,浮點數為有符號數。
M為有效數字,大于等于1,小于2。
2^E表示指數位。
eg:5=>0101=>(-1)^01.012^2. S=0,M=1.01,E=2
規定:對于32位的浮點數(單精度浮點數存儲),最高1位是符號位(S),接著的8位為指數位(E),剩下的23位是有效數字位(M),不滿23位后面補0。
對于64位的浮點數(雙精度浮點數存儲),最高1位是符號位(S),接著的11位為指數位(E),剩下的52位是有效數字位(M)。
對于有效數字M和指數E會有一些特殊規定:
1、因為1<=M<2,所以小數點前必定是1,所以可以省略1和小數點,這樣一來,對于單精度浮點數存儲方式,23位有效數位存的都是小數部份數。讀取時,小數點和1都會被自動加上。等于可以保留24位有效數字。雙精度同理。
2、對于指數E來說,首先說明他是一個無符號整數,對于單精度浮點數存儲方式,E共占8位,則E的取值范圍為0~255。但是科學記數法中,指數是可以為負數的,所以規定,存入內存時,E的真實值必須加上一個中間數,對于8位的E,這個中間數為(255/2=)127(實際表達范圍-127~128),對于11位的E,這個中間數為1023(實際表達范圍-1023~1024)。取數時,再減去127/1023即為實際值。(移碼)
eg. 由上面可知,5的指數為2,對于單精度浮點數存儲方式,實際在內存中存儲的數為127+2=129=>1000 0001。
注意:因為當E為全零時,實際上指數為-127,表示一個接近零很小的數,因此浮點數不能與零比較,用精度來代替。當E為全一時,表示的±無窮大。
綜述:整數與浮點數的存儲方式完全不同,整數存取為原反補碼,浮點數為S、E、M
練習代碼:
#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取出,轉為浮點型,再存給pFloat
float *pfloat = (float *)&n; //將n的地址轉為浮點數地址(即看待n的方式變為浮點數)。
printf("n=%d\n", n);
printf("pFloat=%f\n", pFloat);
printf("*float=%f\n", *pfloat); //解引用后以浮點數形式看待空間里的值 0 00000000 00000000000000000001001 S=0,E=0,(-127)
*pfloat = 9.0; //1001 實際n空間中存的值0 00000011 00100000000000000001001
printf("n=%d\n", n); //轉換為整數為 1091567616
printf("*float=%f\n", *pfloat); // 9.000000
system("pause");
return 0;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。