1. 程式人生 > 實用技巧 >961計組考綱(2)——資料的表示和運算

961計組考綱(2)——資料的表示和運算

961計組考綱(2)——資料的表示和運算

這一部分上課的時候根本沒講過,結果一看真題還考了,遂不得已看看,結果也不是很懂。QAQ

數制與編碼

二進位制與十進位制的轉換,不解釋。

值得注意的是,二進位制的小數位只能表示\(1/2, 1/4, 1/8, ..., 1/2^n\),因此二進位制無法表示所有的十進位制小數,只能近似表示(所以有了浮點數?)

定點數和浮點數的表示與運算

定點數表示

這裡全都考慮有符號數,假設字長有n+1位

  • 原始碼\([-2^n+1, 2^n-1]\):第一位表示符號,剩下表示絕對值數值,表示範圍
  • 反碼\([-2^n+1, 2^n-1]\):第一位表示符號
    • 若是正數,數值位與原始碼相同
    • 若是負數,數值位與原始碼按位取反
  • 補碼\([-2^n, 2^n-1]\):正數與原始碼相同,負數則取反碼+1,0只有一種表示,多出來的10000(1後面n個0)可以表示\(-2^n\),1後面的數值位表示\(-2^n\)後面補上多少絕對值,而原始碼中00000和10000都表示0,顯然不適合程式
  • 移碼\([-2^n, 2^n-1]\):真值加上某個2的冪

定點數運算

補碼機器實現加、減運算的方法統一(模運算-去掉溢位)

  • 符號位和數值位按同樣規則參與運算
  • 逢二進一
  • \([A +B]_{補} = [A]_{補}+[B]_{補} mod(2^{n+1})\)
  • \([A-B]_{補} = [A]_{補}+[-B]_{補}mod(2^{n+1})\)
  • 運算結果仍是補碼

乘除法:異或運算

  • 部分乘積和被乘數取「雙符號位」

浮點數表示法

通常採用\(\mathbf{S} \times 2^{\mathrm{J}}\)

  • 階碼J:採用定點整數表示(下面的01000)
  • 尾數S:採用定點小數表示(下面的0.10110010001)

\[(178.125)_{10}=(10110010.001)_{2}=0.10110010001 \times 2^{01000} \]

IEEE 754標準

  • IEEE 754中尾數m採用源碼錶示(理解為科學計數法的基,不帶符號,而且去掉了第一個有效數字1,真是節省儲存空間到了極致),階碼部分用移碼錶示(就是\(E-127\)或者\(E-1023\),這樣設定的目的可以通過\(E \in [1,254]\)

    的取值大小控制正整數和小數部分的表示,)

  • 單精度浮點數32位,雙精度浮點數64位

為了充分利用尾數,增加資料的表示精度,規格化浮點數最高位必須是有效值(小數點前是1,第1位有效數字)

  • 單精度浮點數表示公式:\((-1)^{S} \times 1 . m \times 2^{(E-127)}\)

    • float所能表示的最大正整數:符號0,階碼取最大值為127(即254-127),令m(23位)尾數全為1時最大,則\(m=2-2^{-23}\),結果是\((2-2^{-23}) \times 2^{127}=2^{128}-2^{104}\)
    • 【為什麼階碼最大隻能取127:IEEE標準偏置值位127時,空出8位全1來表示無窮大,空出全0表示非規格化數,故階E的取值不超過\(2^{8}-2 = 254\),範圍在1~254之內】
  • 雙精度浮點數表示公式:\((-1)^{S} \times 1 . m \times 2^{(E-1023)}\)

恢復成IEEE儲存形式的時候記得不要放錯地方,運算的時候記得把m寫成1.m再計算啊啊啊

浮點數運算

  • 浮點數運算的特點是階碼運算和尾數運算分開進行,浮點數的加減運算一律採用補碼。

  • 浮點數加減運算一般包括:對階、尾數運算、規格化、舍入、判斷溢位

    • 對階:對階的目的是為使兩個浮點數的尾數能夠進行加減運算,畢竟兩個數指數相同才能提公因式加減啊。

      • 顯然,尾數邏輯右移時,捨棄掉的有效位會產生誤差,影響精度
    • 尾數運算:對階後的尾數按照定點數的規則加減即可

    • 規格化

      • 左規:
      • 右規:
    • 舍入

    • 判斷溢位

  • (2017-961)浮點數除法運算的三個基本步驟:階碼運算、尾數運算、結果規格化

舉個栗子:

https://blog.csdn.net/shuzfan/article/details/53814424

算術邏輯單元ALU

序列加法器和並行加法器

ALU的功能和結構