Try   HackMD

2020q1 第 6 週測驗題

tags: linux2020

目的: 檢驗學員對 bitwise、數值系統和浮點數的認知


測驗 1

考慮到以下浮點數除法程式: (fdiv.c)

#include <stdio.h>
#include <stdlib.h>

double divop(double orig, int slots) {
    if (slots == 1 || orig == 0)
        return orig;
    int od = slots & 1;
    double result = divop(orig / D1, od ? (slots + D2) >> 1 : slots >> 1);
    if (od)
        result += divop(result, slots);
    return result;
}

假設 divop() 的第二個參數必為大於 0 的整數,而且不超過 int 型態能表達的數值上界。請補完程式碼。

作答區

D1 = ?

  • (a) 4
  • (b) 3
  • (c) 2
  • (d) 1

D2 = ?

  • (a) 4
  • (b) 3
  • (c) 2
  • (d) 1

延伸問題:

  1. 解釋上述程式碼運作原理;
  2. 以編譯器最佳化的角度,推測上述程式碼是否可透過 tail call optimization 進行最佳化,搭配對應的實驗;
  3. 在 Linux 核心原始程式碼找出類似的技巧;