# 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. 找出類似的最佳化程式碼並解釋 ::: --
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.