天天看點

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完全相似.

附:

 移碼(又叫增碼)是符号位取反的補碼,一般用做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。

  ①移碼的定義:設由1位符号位和n位數值位組成的階碼,則 [X]移=2En + X -2n≤X ≤ 2n

  例如: X=+1011 [X]移=11011 符号位“1”表示 正 号

  X=-1011 [X]移=00101 符号位“0”表示 負 号

  ②移碼與補碼的關系: [X]移與[X]補的關系是符号位互為相反數(僅符号位不同),

  例如: X=+1011 [X]補=01011 [X]移=11011

  X=-1011 [X]補=10101 [X]移=00101

  ③移碼運算應注意的問題:

  ◎對移碼運算的結果需要加以修正,修正量為2En ,即對結果的符号位取反後才是移碼形式的正确結果。

  ◎移碼表示中,0有唯一的編碼——1000…00,當出現000…00時(表示-2En),屬于浮點數下溢。