浮點數的存儲
爲什麼討論浮點數
- 計算機只能識別二進制,整數轉化爲二進制沒有任何問題。
- 但是!浮點數有小數點, 計算機怎麼識別!必然要有個規範來規定計算機怎麼識別吧!這個規範就是國際標準IEEE 754.
浮點數的識別規範
標準規定,任何浮點數的表現形式爲
- V= (-1)^S x M x 2^E
- 符號位S
- 尾數位M
- 指數位E
32bit : 符號位1,指數位8,尾數位23
64bit : 符號位1,指數位11,尾數位52
尾數位 M 默認總是1.xxx的形式,秉着優化的概念,標準規定保存的時候可以捨棄,讀取的時候再加上,這樣尾數範圍也增加了 1 位
指數位2^E , E爲8,指數範圍0~255; E爲11,指數範圍 0~2047
- 但是!指數E可能爲負數 也就是說指數範圍可能爲-127-128了,爲了不出現負數,標準規定採用移位存儲,保存的E數據就要+127或者+1023;
- 比如E = 10,必須保存成10+127=137,即10001001
(1)E不全爲0或不全爲1。這時,浮點數就採用上面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。
(2)E全爲0。這時,浮點數的指數E等於1-127(或者1-1023),有效數字M不再加上第一位的1,而是還原爲0.xxxxxx的小數。這樣做是爲了表示±0,以及接近於0的很小的數字。
(3)E全爲1。這時,如果有效數字M全爲0,表示±無窮大(正負取決於符號位s);如果有效數字M不全爲0,表示這個數不是一個數(NaN)。
單精度和雙精度誤差
- 十進制轉化爲二進制的時候,要是永遠除不盡,單精度轉換爲雙精度的時候,位數變少,多餘的值被省忽略了,就會產生誤差的問題