float double 的存储方式
float 和 double 的表示法:
都是二進制的科學表示法:
± mantissa?×?2 exponent
(mantissa:尾數,exponent:指數,均使用二進制表示)
?float(浮點型)在內存中占4個字節(Byte),即32位(bit)
存儲方式如下:
| 1 bit(符號位) | 8 bit(指數位) | 23 bit(尾數位) |
符號位:1 ? bit,0表正,1表負
指數為:8 ? bit,推算的8個bit能表示的范圍為0 - 2的8次方減1,即0 - 255,但是這里的值都是加了127的,所以實際能表示的范圍為:-127 - 128
尾數位:23 bit,推算得23個bit能表示的范圍為0 - 2的23次方減1,即0 - 8388607,最大值為7位數,但是不能表示所有的7位數,不過所有的6位數是可以包含的,所以精度為6個有效數字(注:這也就是為什么說float的精度為6-7位,但實際能確定的只有6位)
所以我們比較兩個float是否相等時,常常這樣寫:
const float EPSILON = 0.000001;float f1 = 123.234567;float f2 = 123.234568;if (fabs(f1-f2) <= EPSILON){cout<<"equal"<<endl;} else{cout<<"not equal"<<endl;}
最大值:由上面得指數最大為128,即此時最大值為2的128次方,為 3.402823466E+38
最小值:符號位為1時,表負,所以最小值即最大值取負的即可,為 -3.402823466E+38
當指數為-127時,決定了浮點數所能表達的絕對值最小的非零數,為1.175494351E-38
double(雙精度浮點型)在內存中占8個字節(Byte),即64位(bit)
存儲方式如下:
| 1 bit(符號位) | 11 bit(指數位) | 52 bit(尾數位) |
符號位:1 ? bit,0表正,1表負
指數為:11 bit,推算的11個bit能表示的范圍為0 - 2的11次方減1,即0 - 2047,但是這里的值都是加了1023的,所以實際能表示的范圍為:-1023 - 1024
尾數位:52 bit,推算得52個bit能表示的范圍為0 - 2的52次方減1,即0 - 4503599627370495,最大值為16位數,但是不能表示所有的16位以內的數,但是所有的15位數是可以包含的,所有精度為15個有效數字
最大值:由上面得指數最大為1024,即此時最大值為2的1024次方,為 1.7976931348623158E+308
最小值:符號位為1時,表負,所以最小值即最大值取負的即可,為 - 1.7976931348623158E+308
當指數為-1023時,決定了浮點數所能表達的絕對值最小的非零數,為2.2250738585072014E-308
舉個例子:
1. 得到float類型的 -10.5 的內存表示
首先得到-10.5的二進制表示法,- 1010.1,二進制的科學表示法為:- 1.0101 * 2的3次方
這樣可以得到
符號位:因為是負的,所以為1
指數位:上面得到指數為3,加上127得到130,二進制表示為10000010
尾數位:只表示小數點后面的即可,即0101,后面補0即可,一共23位,需補19個0,最終二進制表示為:0101 0000 0000 0000 0000 000
最后把上面的符號位,指數位,尾數位加起來就得到了二進制表示:(紅色表符號位,綠色表指數為,藍色表尾數位)
110000010 01010000000000000000000
按照8個bit一個byte,區分開來得到
1100 0001 0010 1000 0000 0000 0000 0000?十六進制表示即為:0x c1 28 00 00
由于機器為小端,低位先存,高位后存,所以內存中實際存儲為:
0000 0000 0000 00000010 10001100 0001十六進制表示即為:0x 00 00 28 c1
可以寫個程序測試下,你會發現-10.5的內存表示確實是0x 00 00 28 c1
2. 一個小端機器中,float的內存數據為 0x 00 00 85 41,求這個float數
首先,由于是小端,得到原本的十六進制:0x 41 85 00 00?
得到二進制數據:0100 0001 1000 0101 0000 0000 0000 0000
再以顏色區分(紅色表符號位,綠色表指數為,藍色表尾數位)
得到數據:? ??0100 0001 1000 0101 0000 0000 0000 0000
然后提取得到:
符號位:0,表正數
指數位:10000011,即十進制數131,減去127后得到4
尾數位:000 0101 0000 0000 0000 0000 ?舍去后面多余的0,即0000101
由上面公式得到,該float數據為 1.0000101 * 2的4次方,小數點右移4位,即10000.101
小數點左邊數據,10000即16
小數點右邊數據,0.101即1*2^-1 +0 * 2^-2 +1* 2^-3? = 0.5 + 0 + 0.125 = 0.625
最后左右加后邊,即16+0.625 = 16.625
可以寫個程序測試下,你會發現16.625的內存表示確實是0x 00 00 85 41
總結
以上是生活随笔為你收集整理的float double 的存储方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大端 小端 原码 反码 补码 及内存中的
- 下一篇: Visual Studio各个版本对应关