# [2020q1](http://wiki.csie.ncku.edu.tw/linux/schedule) 第 6 週測驗題
###### tags: `linux2020`
:::info
目的: 檢驗學員對 bitwise、數值系統和浮點數的認知
:::
---
### 測驗 `1`
考慮到以下浮點數除法程式: (fdiv.c)
```cpp
#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
:::success
延伸問題:
1. 解釋上述程式碼運作原理;
2. 以編譯器最佳化的角度,推測上述程式碼是否可透過 [tail call optimization](https://en.wikipedia.org/wiki/Tail_call) 進行最佳化,搭配對應的實驗;
3. 在 Linux 核心原始程式碼找出類似的技巧;
:::
---