一道浮點數計算的題目,計算了很長時間,最終結果還是因為部分細節出錯,導致全盤皆錯,因此,有必要認真總結浮點數計算牽涉到的方方面面的資料表示的細節。
這個過程本身相當有趣,因為人腦在處理二進位制方面並沒有十進位制那種直覺。尤其是當在補碼下計算,總是得先進行一次資料的反加1才能看出數字的本意,進行乙個減法,也需要默念,將減數連通符號位求反加一再和減數相加。甚至不如直接進行十進位制數的加減再換算為補碼。。
這個過程中需要多次進行這樣的計算,僅僅明了計算規則,根本不能解決問題,需要的是細心,以及–實力。
好了,直接看題目,然後再在解析的過程中,一一解釋。
已知十進位制數x = -5/256, y = +59/1024,按機器補碼浮點運算的規則計算x-y,結果用二進位制表示,浮點數的格式如下:階符取2位,階碼取3位,數符取2位,尾數取9位。ok,首先在腦海中建立一種浮點數的格式:階符+階碼+數符+尾數。
且均用補碼表示。
這裡題目中給出的小數很nice。
先用自然的語言表示一下,不考慮有多少位數用於儲存: x=
−101⋅2
−8 y
=+111011⋅2
−10
再考慮移位使之滿足規格化的形式。 x=
−0.101⋅2
−5 y
=0.111011⋅2
−4
再最終化為補碼的形式:x=
11,011;11,
011000000
(分號前是階碼的補碼表示:-5,分號後面是-0.101的補碼表示) y=
11,100;00,
111011000
(分號前面是階碼的補碼表示:-4,分號後面是0.111011的補碼表示)
這裡有我比較迷惑的一點,在表示-0.101的時候,化為補碼我知道是11.011,但是尾數有9位,在後面要補1還是補0?
如果是補1的話就是:
11.011
,111
,111
補 化回來就是
11.100
,000
,001
原 ,等同於末尾加了個1,且前面的三位也不是以前的了。因此補1是不行的。
如果補0:
11.011
,000
,000
補 化回來是
11.101
,000
,000原
我們知道後面的6個0,求反變成1後,是6個1,再因為加1會變成6個0並且往上進製乙個1.
這裡是不是因為11.011最低位是1,所以正確,如果是
11.010
補 呢?
11.010
補 對應的原碼是
11.110原
我們把補碼補位到9位:
11.010
,000
,000
補 ,化回來是:
11.110
,000
,000原
模擬這個過程時,突然明白了補0的原因:原碼的資料位變補碼是求反加1,這個1加在原來資料位的最低位,現在最低位在補的資料位里成了中產階級,這個1會加到新的資料位長度的位置上,這是不行的,因此這個補貼需要通過鏈式傳遞的方式傳回來。因此,補位的補碼全是0.
解釋的原因就是想說,如果乙個補碼小數被擴大了尾數的表示位數,在低位補0.
ok,表示結束後,開始對階:小階變大階。
所以是x的階碼往大里變。x=
11,100;11,
101,
100,
000補 y
=11,100;00
,111
,011
,000補
於是再進行尾數求和:[x
尾]補−
[y尾]
補=[x
尾]補+
[−y尾
]補
其中[−y
尾]補=
[y尾]
補連同符
號位求反
加一
所以得到:10,
110,
001,
000 所以有溢位,需要右規,變成:11,
011,
000,
100 .
右歸必然使得階碼加1,可以表示成: 11,
100+00,
001=11,
101
於是最終結果是:11,101;11,011,000,100.
也就是:2−
3⋅(−
0.1001111)2
=−0.0771484375
而我們知道,如果真的計算$x - y = +0.0380859375$
可見,因為位數的限制,還是有很大的誤差的。
一道題看水平
題目 四個正整數abcd,均小於10000。寫乙個函式實現d等於a的b次方與c取餘。一 int function int a,int b,int c return s 二 unsigned int fact unsigned int a,unsigned int b,unsigned int c r...
由一道試題想到的
前段時間忙著換工作,面試了幾家公司,其中有些筆試題,蠻有意思的,給我很大啟發。最好玩的一道程式設計題 不使用中間變數,交換2個int型變數a和b的值。寫出方法。這個其實不是很難,方法如下 public class exchange void swap int a int b 給我的啟發是,在程式設計...
一道抽象向量組習題
設a是mxn矩陣,m n,且a的行向量組線性無關,b是nx n m 矩陣。b的列向量組線性無關,且ab o的解,已知 是齊次方程組ax 0的解,證明 by 有唯一解。這乙個小題運用了很多好玩的知識點。分析 由 m n 且a行向量線性無關,得出r a m。而b列向量組線性無關得出r b n m,那麼秩...