contributed by < OscarShiang
>
1
本題的的用意在於利用遞迴呼叫的手法來實作浮點數的除法。
看到本題實作的程式碼
我們可以從計算 od
與 divop
的 slots
進行的位移運算知道
D1 應該會是
D1 =
2
因為 >>
與 <<
這些 bitwise 的運算子只適用在 int
的資料型態上,所以如果我們要利用 2 化簡除數與被除數的時候就會需要使用 orig / 2
的方式來進行
而當我們將兩者化簡到不能再以 2 來化簡的時候,就需要進行逼近的方式來進算,因此在 D2
的位置就嘗試透過將 slots
加一使其改成偶數的方式來逼近 orig / slots
的浮點數數值。
最後因為 od == 1
的時候我們採取的手法是用逼近的方式,所以最後我們需要利用 result += divop(result, slots)
這行指令來做數值的修正。
最後以 float 的除法與 divop
來比較兩者在計算 的表現
測試程式的行為如下所示
在精準度的表現上,divop
優於浮點數的除法
為了測試兩者在執行時間上的差異,我將測試程式修改為下列
測量的結果如下,
從結果中可以看到雖然使用 divop
計算得精準度較浮點數除法好,但是在執行時間上因為 divop
需要透過函式不斷遞迴呼叫的方式來逼近計算數值,所以在執行時間上大幅落後浮點數運算。
2
本題嘗試以位元與整數運算來計算出平方根
在這個實作中可以分為幾個階段
為了能夠使用位元運算來判斷該變數的各個位元的狀況,在實作中使用 macro 來實作這樣的功能,將 double 變數的 bit pattern 轉換到 int 變數中
其原理是使用 union
來產生可以以 int
或是 float
的方式來存取的變數,即可將 float
的 bit pattern 取出來存在 int
變數中。
本題所在位置在
這個部分主要就是將我們先前在
所計算出來的 exponent
部分寫入到新的 float 變數中。而 exponenet 的部分對應到 IEEE 754 floating point number 的定義
所以我們需要將 m
的數值放在上圖綠色的位置中,因此 QQ2
的答案就是
QQ2 =
23
3
這題的用意是在實作一個可以計算給定數值能夠表示成幾種連續整數和的程式
例如 9 可以表示成
總共三種可能
而 15 則可以表示成
因此總共有 4 種表示方法
sysprog2020