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