# 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. 找出類似的最佳化程式碼並解釋 ::: --