Try   HackMD

2018q3 第 5 週測驗題

目的: 檢驗學員對數值系統和浮點表示法的認知


測驗 1

考慮以下程式,作用是將給定的無號數值轉增倍並轉化為浮點數形式:

/* 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

考慮以下程式,給定一個浮點數參數,將其絕對值寫回。

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) ~

延伸問題:

  1. 比照 CS:APP 第 2 章的論述和證明方式,解釋為何上述程式碼可運作
  2. 改寫為 big-endian 和 little-endian 都可適用的程式碼
  3. 找出類似的最佳化程式碼並解釋