引言:上文介紹了整型在記憶體中的存盤和大小端問題,(https://blog.csdn.net/m0_47646784/article/details/117223805),本文介紹一下浮點型數在記憶體中的存盤方式,
目錄
浮點型在記憶體中的存盤
IEEE754標準
舉個“栗子”
單精度和雙精度存盤模型圖
M和E的特別規定
經典浮點數存盤例題
浮點型在記憶體中的存盤
IEEE754標準
根據國際標準,任意一個浮點數可以寫成以下形式:-1^S * M *2^E (特別注意這里的^代表上升符號,表示M、E在 指數位,并非C語言的異或)
(-1)^S表示符號位,S為0,為正數,S為1則為負數
M代表有效數字,大于等于1,小于2
2^E代表指數位
舉個“栗子”
5.0寫成二進制數位101.0,可以化為-1^0 x 1.01 x 2^2,即S=0,M=1.01,E=2
單精度和雙精度存盤模型圖
IEEE754規定 : 對于32位的浮點數,最高的1位是符號位s,接著的8位是指數E,剩下的23位為有效數字M,

64位的浮點數,最高的1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M,

M和E的特別規定
M的規定
前面提到M是1到2之間的數,可以寫成1.xxxxxxxxx,
所以IEEE754規定,在計算機內部保存M時,默認這個數的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分,這樣做的目的是可以節省一位有效數字,
E的規定
首先,E為一個無符號整數(unsigned int )這意味著,如果E為8位,它的取值范圍為0 - 255;
如果E為11位,它的取值范圍為0~2047,但是,科學計數法中的指數E是可以出現負數的,所以IEEE754規定,存入記憶體時E的真實值必須再加上一個中間數,對于8位的E,這個中間數是127;
對于11位的E,這個中間數是1023,比如,2 ^ 10的E是10,所以保存成32位浮點數時,必須保存成10 + 127 = 137,即10001001,
此外還有兩種特殊情況
E全為0
這時,IEEE754規定浮點數的指數E等于1 - 127(或者1 -1023)即為真實值,有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數,這樣做是為了表示±0,以及接近于0的很小的數字,
E全位1
如果有效數字M全為0,表示±無窮大(正負取決于符號位s);
經典浮點數存盤例題
include<stdio.h>
int main()
{
int n = 9;
//00000000 00000000 00000000 00001001
float* pFloat = (float*)&n;
//*pFloat---是以浮點數的方式訪問n的四個位元組,就會認為n的4個位元組中放的是浮點數
printf("n的值為:%d\n", n); //9
printf("*pFloat的值為:%f\n", *pFloat);//0.000000
*pFloat = 9.0;
//以浮點數的形式存盤9.0
printf("num的值為:%d\n", n); //1091567616
printf("*pFloat的值為:%f\n", *pFloat);//9.000000
return 0;
}
列印了四次:
第一次列印:以整型方式存盤,以整型取出列印,為9
第二次列印:n以整型方式存盤,以浮點型的方式取出列印,
0 00000000 00000000 00000000 0001001
(-1)^0*2^(-126)*0.00000000 00000000 0001001 無窮小的數字
0.000000 列印結果小數點及其后六位(精度)
第三次列印:*pfloat =9.0 //就是將n賦值為9.0,
以浮點數的方式存盤,以整數的方式取出列印,
1001.0 (-1)^0*1.001*2^3 3+127 = 130 --- 10000010
0 10000010 001 0000000000 0000000000
01000001 00010000 00000000 00000000
以整數的視角看,列印結果為:1091567616
第四次列印:就是按照浮點型列印,結果就為9.000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287614.html
標籤:其他
