1. 程式人生 > >float,double精度

float,double精度

Double與float型別

(1)基本儲存方式:與int、long儲存方式不同,double與float在記憶體中是以符號位、指數位與尾數位三部分進行儲存的,其中符號位表示數字分正負,佔位1位;指數位表示浮點的位置,佔位8位,無符號儲存,取值範圍:0-256,其與實際指數的偏差值為127,尾數表示數值的精度,佔位23位。

我們以8.25為例來進行說明:

8.25用二進位制表示可表示為1000.01,使用2進位制的科學計數法的方式為1.000001*2^3,按照上述方式,符號為+,符號位為1;指數為3,指數位為11;尾數為1,則尾數位為1,其儲存方式為:

符號位(1位)

指數位(8位)

尾數位(23位)

1

11

1

注:對於尾數,每個十進位制轉換成二進位制之後,最高位必為1,最高位為0沒有意義,所以為了提高取值範圍,省略最高位1,也就導致尾數的取值位數是24位。(其中不足位數的前面用0進行補齊)

(2)計算float的精度,精度是指精確到數值的某一位,是指float型別可以表示的數值最大的位數,在十進位制中也表示最大的位數。在用二進位制表示的時候都是以轉換成科學計數法,其最高位為1。在好多部落格與知乎都是以2^23= 8388608為由,所以精度是6~7位為準,我在這裡不能想通;查閱在wiki的ieee上對此已經進行說明。


這裡面的24原因是尾數位數其實也是指取值範圍,所以需要將尾數部分全部取到,也是就是實際的23位加上預設的1位,然後轉換為10進位制,即得到十進位制的位數,因此在十進位制上其實也就只有7位。

(3)計算float的取值範圍:


截圖來自wiki,(-1)sign指代符號位,括號裡面指代的是資料的精度,隱藏的1是固定不變的,括號右邊指代的是指數部分,其中127是差值。這樣的話,value的取值範圍是根據上式得到的,所以其取值範圍是-2^128~2^128。

推論:對於double型別,其推導方式一致,不同的是指數位為11位,尾數位52位,差值1023。