float的數值範圍與小數位精度

float a;
a=1023.00006103515625;//整數部分2^10-1,小數部分2^-14
//a=2047.0001220703125;//整數部分2^11-1,小數部分2^-13
//a=4095.000244140625;//整數部分2^12-1,小數部分2^-12
//a=8191.00048828125;//整數部分2^13-1,小數部分2^-11
//a=16383.0009765625;//整數部分2^14-1,小數部分2^-10
//a=32767.00153125;//整數部分2^15-1,小數部分2^-9
//a=65535.00390625;//整數部分2^16-1,小數部分2^-8
//a=131071.0078125;//整數部分2^17-1,小數部分2^-7
//a=262143.015625;//整數部分2^18-1,小數部分2^-6
//a=524287.03125;//整數部分2^19-1,小數部分2^-5
//a=1046575.0625;//整數部分2^20-1,小數部分2^-4
//a=2097151.125;//整數部分2^21-1,小數部分2^-3
//a=4194303.75;//整數部分2^22-1,小數部分2^-2
//a=-8388607.5;//整數部分2^23-1,小數部分2^-1
a=3.4028234692093846346337460743176E+38;//整數部分2^128
printf("%.16fn",a);//若上面的float整數部分+1,則顯示時將忽略小數部分,將損失小數精度

//如上,float的整數範圍與小數精度相關,原因就是float的存儲方式:
//32位雙字存儲:首位爲符號位S,0爲正1爲負;後8位爲指數E,底數爲2;最後23位爲尾數M
//            Address+0    Address+1    Address+2    Address+3
//Contents    SEEE EEEE    EMMM MMMM    MMMM MMMM    MMMM MMMM
//其數值大小即爲X=((-1)^S)*M*(2^E)
//因此有小數部分時,float的整數二進制位與小數二進制位和爲23;
//沒有小數部分時,float的整數範圍可達到2^128即3.4028236692093846346337460743177e+38
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章