由一道習題看如何設計浮點數

2021-07-23 02:58:58 字數 2357 閱讀 3563

一道浮點數計算的題目,計算了很長時間,最終結果還是因為部分細節出錯,導致全盤皆錯,因此,有必要認真總結浮點數計算牽涉到的方方面面的資料表示的細節。

這個過程本身相當有趣,因為人腦在處理二進位制方面並沒有十進位制那種直覺。尤其是當在補碼下計算,總是得先進行一次資料的反加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,那麼秩...