float與double類型的內存分佈,精度和範圍

float與double類型的內存分佈,精度和範圍

 

 內存分佈:

C/c++的浮點數據類型有float和double兩種。

float大小爲4字節,內存中的存儲方式如下:

符號位(1bit)指數(8bit)尾數(23bit)

double大小爲8字節,內存中的存儲方式如下:

符號位(1bit)指數(11bit)尾數(52bit)

符號位決定浮點數的正負,0正1負。指數和尾數均從浮點數的二進制科學計數形式中獲取。

如,十進制浮點數2.5的二進制形式爲10.1,轉換爲科學計數法形式爲(1.01)*(10^1)。

由此可知指數爲1,尾數(即科學計數法的小數部分)爲01。

 根據浮點數的存儲標準,指數用移碼錶示。0的float類型移碼爲127(0111 1111),0的double類型移碼爲1023(011 1111 1111)。運算時,在0 的移碼基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。

所以float和 double類型分別表示的2.5如下(二進制):

符號位               指數                                       尾數

0                     1000 0000                             010 0000 0000 0000 0000 0000

0                     100 0000 0000 0100             0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

 

精度:

 float和double的精度是由尾數的位數來決定的。

 float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字; double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。

 

範圍:

 float類的指數是8位移碼,最大爲127最小爲-127,127用來作2的指數,爲2^127,約等於 1.7014*10^38, 而我們知道,floa示數範圍約爲- 3.4*10^38-------3.4*10^38, 這是因爲尾數都爲1時,即1.11..11約爲2,因此浮點數的範圍就出來了.double的情況與float完全相似.



轉自:http://blog.csdn.net/rambo_ghaip/article/details/4578760

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章