浮點數存儲
A. 浮點數 在計算機內的存儲形式
浮點數不難,但是要想記熟還真有點不容易,多琢磨琢磨。
一般情況下,浮點數的表示有一下幾個要點:
1、要規格化(讓浮點數表示結果唯一),因為100=10^2 = 0.1 * 10^3, 所以第一步要統一地規格化,確定「階數」和「尾數」(尾數在0.5-1之間,也就是二進制的0.1-1.0之間)
2、「階碼」一般用「移碼」表示法,而「尾數」一般用「原碼/補碼表示法,「數符」表示浮點數的正副號
3、浮點數的形式: 「符號位」【應該就是『數符』】+「階碼」+「尾數「
--浮點數的表示按照不同地標准,表示方法不同,你的原問題沒講清楚用什麼格式表示,我就用最常用地格式來理解了
------------------
其實就以上兩點,計算機中「『帯符號數』的表示」有四種:原碼、補碼、反碼、移碼,這些都是基礎知識,可以自己去看一下這四種表示方法,就自然明白「階符、數符」這些相當於「符號位」的作用了。
先簡單講一下吧,你再結合詳細資料看吧:【設所表示的都是定點純小數】
(小數點前面可以看成是「符號位」,也就對應原來地「階符」和「數符」)
原碼:0.11表示0.75(2^-1 + 2 ^-2), 1.11表示 『-0.75』(前面的1相當於符號位,表示這個數是負數,也就是說「符號位是0」表示正數,1表示負數)
補碼:最普遍地就是補碼了 0.11表示0.75, 1.11表示『-0.25』(也是「0」為正數,1為負數。和原碼地規律一樣)
反碼,最簡單了:正數不變,負數對每一位『取反』即可,0.11=0.75,1.10=-0.25(即0.01地相反數)
-------------以上三種表示方法,對正數的情況都不做處理,但是移碼表示法要對正數做處理。
移碼:1.01=0.25,而0.01=-0.75
。移碼復雜一點,他的表示方法是: 移碼= 2^階碼位數 + 真值(真值:指原來那個『帯符號數』,注意要把把正副號帶入計算)
-----------------------------------
N=-0.110101x2^100: 階數是「正100」,尾數是「負0.110101」,所以整個浮點數是個負數,所以第一位是「1」【第一個符號位-「數符」表示『尾數的正負號』】
階碼是「10 0100」【移碼表示法,最高位是「符號位」】
所以,應該表示為: 1(符號位) 100100(階碼的移碼表示) 11010100【尾數和符號位結合起來,用的是原碼表示法】
B. 請問浮點型數據在計算機是怎麼存儲的
對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit,double數據佔用64bit。
無論是單精度還是雙精度在存儲中都分為三個部分:
1、符號位(Sign) : 0代表正,1代表為負。
2、指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲。
3、尾數部分(Mantissa):尾數部分。
(2)浮點數存儲擴展閱讀
實型變數分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double
雙精度說明符。在Turbo
C中單精度型佔4個位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。
雙精度型佔8
個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變數說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
C. 浮點數的存儲問題
先看看浮點數格式
·一個浮點數總共有4個位元組,32位
第一個比特表符號 0正數 1負數
後八個比特表階碼,即為指數,這個數在實際的數上面加127
最後23個比特表尾數 原碼表示
具體分析
對於3.25
正數 首位為0
用二進製表示 11.01=1.101乘以2的1次方
所以階碼為1 127+1=128
10000000
對於尾數1.101,因為規格化的數都是最高位為1,即小數點左邊的數為1
所以這個1就省略,因此存儲的時候就存101
即
10100000 00000000 0000000
把所有的拼起來
01000000 01010000 00000000 00000000
你的上面最後寫反了
D. 計算機浮點數的儲存原理
浮點是以單元形式儲存在內存上的,但每個單元內存有限,所以比如你想輸入1/3的話,你以為是1/3了,實際上不足1/3,而是0.3333333333333333,所以計算時,會以0.3333333333333333的形式去計算,而不是1/3,因此出現了本來是0.6的,而輸出卻是0.599976.建議把浮點精度變大