# 2018q3 第 5 週測驗題
:::info
目的: 檢驗學員對數值系統和浮點表示法的認知
:::
---
### 測驗 `1`
考慮以下程式,作用是將給定的無號數值轉增倍並轉化為浮點數形式:
```Clike
/* Return bit-level equivalent of expression 2 * uf
* for floating point uf
*/
unsigned float_twice(unsigned uf) {
unsigned uf_sgn = (uf >> A1) & 0x01;
unsigned uf_exp = (uf >> A2) & 0xff;
if (uf_exp == 0) {
uf <<= 1;
uf += (uf_sgn << A3);
}
else if (uf_exp != 0xff) {
uf_exp += A4;
uf &= 0x807fffff;
uf = uf + (uf_exp << A5);
}
return uf + A6;
}
```
假設 unsigned int 寬度為 32-bit,考慮三種狀況:
1. 如果是 denormalied 的數值,左移一位,溢出則到指數位的最低位
2. 如果是 normalized 的數值,指數位加一
3. 如果是 `NaN`,返回 `NaN`
補完程式碼。
==作答區==
A1 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
A2 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
A3 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
A4 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
A5 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
A6 = ?
* `(a)` 32
* `(b)` 31
* `(c)` 30
* `(d)` 29
* `(e)` 28
* `(f)` 27
* `(g)` 26
* `(h)` 25
* `(i)` 24
* `(j)` 23
* `(k)` 0
* `(l)` 1
---
### 測驗 `2`
考慮以下程式,給定一個浮點數參數,將其絕對值寫回。
```C
void absf(double *x) {
*(((int *) &x) + S1) S2= 0x7fffffff;
}
```
假設 unsigned int 寬度為 32-bit,並在且 little-endian 環境。其中 S1 是個數值,S2 是個運算子,請補完。
==作答區==
S1 = ?
* `(a)` 0
* `(b)` 1
* `(c)` 2
* `(d)` 3
* `(e)` 31
S2 = ?
* `(a)` *
* `(b)` /
* `(c)` +
* `(d)` -
* `(e)` |
* `(f)` &
* `(g)` ^
* `(h)` ~
:::success
延伸問題:
1. 比照 [CS:APP](https://hackmd.io/c/S1vGugaDQ/) 第 2 章的論述和證明方式,解釋為何上述程式碼可運作
2. 改寫為 big-endian 和 little-endian 都可適用的程式碼
3. 找出類似的最佳化程式碼並解釋
:::
--