定点数(fixed-point number)的运算
定點數的運算
- 1. 定點數
- 2. 定點數加減運算
- 3. 定點數加減運算的溢出判斷
-
- 3.1 用一位符號位判斷溢出
- 3.2 用兩位符號位判斷溢出
- 3.3 最高位和次高位判斷溢出
- 4. 乘法運算
-
- 4.1 分析筆算乘法
- 4.2 筆算乘法的改進
- 4.3 圖示
- 4.4 硬件配置
- 4.5 表格示意圖
- 5. 除法運算
-
- 5.1 分析筆算除法
- 5.2 筆算除法和機器除法比較
- 5.3 原碼除法
-
- 5.3.1 恢復余數法
- 5.3.2 不恢復余數法(加減交替法)
tip:表示方法,可見定點數(fixed-point number)的表示方法
參考文檔:定點數與浮點數:https://www.cnblogs.com/kevinq/p/4480563.html
FPGA的算法解析3 定點數與浮點數:https://zhuanlan.zhihu.com/p/472748886
定點數運算:https://blog.csdn.net/limanjihe/article/details/52440544
定點運算——乘法:https://blog.csdn.net/Blackoutdragon/article/details/104863319
計算機組成原理 定點運算-移位、加、減、乘、除(詳細解析-看完就會):https://zhuanlan.zhihu.com/p/150650554
1. 定點數
定點數中小數點的位置由兩個參數確定,一個是定點數的位寬 w,小數位的位寬 wf 。
下面給出一個例子,2Q6(Fix9_6)
2Q6 包含一個 1 個符號位,2 個整數位,6 個小數位。
2. 定點數加減運算
不論操作數是正還是負,在做補碼加減法時,只需將符號位和數值部分一起參與運算,并且將符號位產生的進位丟掉即可。如:
short A=-9, B=-5;
cout<<A+B<<endl; //-14
推導過程如下(A與B都是定點數表示的純整數):
A的原碼為:1000 0000 0000 1001,因此補碼為:1111 1111 1111 0111
B的原碼為:1000 0000 0000 0101,因此補碼位:1111 1111 1111 1011
A+B的補碼為:1 1111 1111 1111 0010,將符號位產生的進位丟掉,因此最終結果為:
1111 1111 1111 0010,結果的原碼為:1000 0000 0000 1110,即-14。
注:書寫約定整數的符號位與數值位之間用逗號隔開,小數的符號位與數值位之間用小數點隔開。
定點數計算
- 定點數相加時,將兩數二進制的小數點對齊,直接相加;
- 定點數相減時,將減數化為補碼后相加。
- 定點數乘法與普通小數乘法一致,但在相加前進行補位,將加數左側對齊。
3. 定點數加減運算的溢出判斷
3.1 用一位符號位判斷溢出
對于加法,只有在正數加正數和負數加負數兩種情況下才可能出現溢出,符號不同的兩個數相加是不會溢出的。
對于減法,只有在正數減負數和負數減正數兩種情況下才可能出現溢出,符號相同的兩個數相減是不會溢出的。
由于減法運算在機器中是用加法器實現的,因此:不論是作加法還是減法,只要實際操作數(減法時即為被減數和“求補”之后的減數)的補碼符號位相同,而結果的符號位又與操作數補碼符號位不同,即為溢出。(進一步解釋:兩個符號位相同的補碼相加,如果和的符號位與加數的符號相反,則表明運算結果溢出;兩個符號位相反的補碼相減,如果差的符號位與被減數的符號位相反,則表明運算結果溢出。)如:
在4位機中,A=5,B=-4,則A-B溢出,推導過程如下:
A的原碼為0101,補碼為0101;
-B的原碼為0100,補碼為0100;
A-B的補碼為1001,結果的符號位為1,實際操作數的符號位為0,因此溢出。
一位符號位判斷溢出方法不僅需要判斷加法運算的結果,而且需要保持原操作數。
3.2 用兩位符號位判斷溢出
此時判斷溢出的原則是:當2位符號位不同時,表示溢出;否則無溢出。不論是否發生溢出,高位符號位永遠代表真正的符號。
運算結果的符號位為01表明兩個正數相加,結果大于機器所能表示的最大正數,稱為上溢;運算結果的符號位為10表明兩個負數相加,結果小于機器所能表示的最小負數,稱為下溢。
也就是說,兩個正數相加,數值位不應向符號位同時產生進位,使得結果數的符號位和操作數的一樣,為00:
00+00+00(進位)=00 (mod 4)
兩個負數相加,數值位應向符號位產生進位,使得兩個負數的雙符號位的運算為11;
11+11+01(進位)=11 (mod 4)
當運算結果的兩個符號位不相同時,表明出現了溢出。判斷溢出的邏輯表達式:
其中Z′為增加的符號位。
例:設x=+1100,y=+1000,求6位雙符號位補碼之和[x+y]補。解:[x]補=001100, [y]補=001000[x+y]補=001100+001000=010100[x+y]補=010100,其中兩個符號位出現01,表示已溢出。
例:設x=-1100,y=-1000,求6位雙符號位補碼之和[x+y]補。解:[x]補=110100, [y]補=111000[x+y]補=110100+111000=101100[x+y]補=101100,其中兩個符號位出現10,表示已溢出。
例:設x=-0.1011,y=-0.0111,則x+y溢出,推導過程如下:解:x的原碼為11.1011,補碼為11.0101;y的原碼為11.0111,補碼為11.1001,因此x+y的補碼為1 10.1110,將符號位產生的進位丟掉,則結果為10.1110,因此溢出。
例:設x=0.1011,y=0.0111,則x+y溢出,推導過程如下:解:x的原碼為00.1011,補碼為00.0101;y的原碼為00.0111,補碼為00.1001,因此x+y的補碼為01.0000,則結果為01.0000,因此溢出。
采用雙符號位補碼后,任何小于1的正數,兩個符號位都是0;任何大于-1的負數,兩個符號位都是1。如果兩個數相加后,其結果的符號位出現01或10時,表示發生溢出。因為兩個絕對值小于1的數相加,其結果不會大于或等于2,所以最高位總是表示正確的符號。這也可以表示為:當最高數據位有進位而符號位無進位時產生上溢出(01);當最高數據位無進位而符號位有進位時,表示下溢出(10)。
在雙符號位補碼中,正常的數據中兩個符號位總是相同的,所以在存儲數據時不必重復存儲,只是在將數據送往運算部件進行運算時才把符號位進行復制形成雙符號位補碼。
3.3 最高位和次高位判斷溢出
利用數據編碼的**最高位(符號位)和次高位(數值部分的最高位)**的進位狀況來判斷運算結果是否發生了溢出。
兩個補碼數實現加減運算時,若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢出。因為當x和y均為n+1位正整數時,其和有兩種情況:當x+y<2n時,不會發生溢出;當x+y≥2n時符號位沒有進位,表明發生溢出。當x和y都是n+1位負數時,其和也有兩種情況:當x+y≥-2n時,不會發生溢出;當x+y<-2n時,符號位相加后變成0并且有進位,而數值部分的最高位相加時無進位,結果變為正數,表明發生了溢出。減法的情況與此類似,這種判斷方法的邏輯表達式如下:
例:設x=+1011, y=+1001,求[x+y]補。解:[x]補=01011, [y]補=01001[x+y]補=01011+01001=10100兩個正數相加,最高兩位的進位為01,表示發生了溢出,其結果為負數,顯然是錯誤的。
例:設x=-1101,y=-1011,求[x+y]補。解:[x]補=10011, [y]補=10101[x+y]補=10011+10101=01000兩個負數相加,最高兩位的進位為10,表示發生了溢出,其結果為正數,顯然是錯誤的。
4. 乘法運算
4.1 分析筆算乘法
設A=0.1101,B=0.1011,求A×B。
- 對于定點數的乘法,分為兩部分
- 將乘數和被乘數的符號位提出,單獨進行異或運算
- 將將乘數和被乘數的數值部分取絕對值們,進行移位加法運算
- 通過下述對筆算的分析,得到對于二進制的乘法數值部分而言,只有兩種運算過程
- 乘數對應的位數為0,不加被乘數
- 乘數對應的位數為1,那就進行相應的移位之后,加上對應的被乘數
- 得到最終對應的結果
所以 A×B=+0.10001111
可見,這里包含著被乘數4的多次左移,以及四個位積的相加運算。
若計算機完全模仿筆算乘法步驟,將會有兩大困難:其一,將四個位積一次相加,機器難以實現;其二,乘積位數增長了一倍,這將造成器材的浪費和運算時間的增加。為此,對筆算乘法做些改進。
4.2 筆算乘法的改進
將A?B= A?0.1011
=0.1A+0.001?A+0.0001?A
=0.1A+0.00?A+0.001(A+0.1A)
=0.1A+0.01[0?A+0.1(A+0.1A)]
=0.1{A+0.1[0?A+0.1(A+0.1A)]}
=2-1{A+2-1 [0?A+2-1 (A+2-1A)]}
=2-1{A+2-1 [0?A+2-1 (A+2--1(A+0))]}
由上式可見,兩數相乘的過程,可視作加法和移位(乘2-1相當于做一位右移)兩種運算,這對計算機來說是非常容易實現的。
從初始值為0開始,對上式作分步運算,則
第一步:被乘數加零 A+0=0.1101+0.0000=0.1101
第二步:右移一位,得新的部分積 2-1 (A+0)=0.01101
第三步:被乘數加部分積 A+2-1(A+0)=0.1101+0.01101=1.00111
第四步:右移一位,得新的部分積 2-1 A+2-1 (A+0)=0.100111
第五步: 0?A +2-1 [A+2-1(A+0)] =0.100111
第六步: 2-1{0?A+2-1 [A+2-1 (A+0)]}=0.0100111
第七步: A+2-1{0?A+2-1 [A+2-1 (A+0)]}=1.0001111
第八步: 2-1 {A+2-1 [0?A+2-1 (A+2-1 (A+0))]}=0.10001111
上述運算過程可歸納為:
①乘法運算可用移位和加法來實現,當兩個四位數相乘,總共需做四次加法和四次移位。
②由乘數的末位值確定被乘數是否與原部分積相加,然后右移一位,形成新的部分積;同時,乘數也右移一位,由次低位作新的末位,空出最高位放部分積的最低位。
③每次做加法時,被乘數僅僅與原部分積的高位相加,其低位被移至乘數所空出的高位位置。
計算機很容易實現這種運算規則。用一個寄存器存放被乘數,一個寄存器存放乘積的高位,又用一個寄存器存放乘數及乘積的低位,再配上加法器及其他相應電路,就可組成乘法器。又因加法只在部分積的高位進行,故不但節省了器材,而且還縮短了運算時間。
4.3 圖示
原文圖示見:https://blog.csdn.net/Blackoutdragon/article/details/104863319
最低位是1,將被乘數加到部分積中。
將乘數中已經判定過的1,移除,丟棄已經沒用。乘數整體右移,這樣乘數最左邊就多出來一個數位。除此之外,將部分積整體右移,左邊拿0補,右邊移出的數不能丟保存到乘數寄存器的第一位。
以乘數新的最后一位進行判定,然后與部分積進行相加
再次進行移位操作,將乘數的最后一位右移刪除,空出的最高位由部分積的移出的最低位補充
乘數的最后一位是0,不用再加上被乘數,所以結果直接為部分寄存器中的值
注意:這里雖然加上的是0,但是在實際操作中,是沒有這一步的,但是控制移位是必修要進行的
將乘數最后一位進行判定,加上被乘數
進行移位運算,最終結果是部分積寄存器中的高位和乘數寄存器中的低位組合,就是最終的結果
4.4 硬件配置
A為移位寄存器,用來保存部分積
Q為移位寄存器,用來保存乘數和部分積的低位部分
X為通用寄存器,用來保存被加數
C為計數器,用來控制整個乘法的運行步驟和循環次數
4.5 表格示意圖
例題:已知x=-0.1110 y=0.1101 求[x·y]原
則[x·y]原=1.10110110
特點:
絕對值運算
用移位的次數判斷乘法是否結束
5. 除法運算
5.1 分析筆算除法
X=-0.1011 y=0.1101 求x/y
x/y=-0.1101
余數 0.00000111
- 上商后補0,和右移1位的除數0.01101做比較,比現在加0后的被除數小,上1,減掉右移1位的除數;
- 添0,和右移2位的除數做比較,小數后有2個0,顯然比現在的余數小,上商1,減掉右移2位的除數,得到新余數;
- 添0,把新余數和右移3位的除數0.0001101做比較,比現在的余數大,上商0,繼續給新的余數添0,和右移4位的除數0.00001101做比較,比新余數小,上商1,減法得到余數
當商的位數和除數的位數一樣時停止
5.2 筆算除法和機器除法比較
5.3 原碼除法
以小數為例
特點
商的符號位單獨處理x與y異或運算
數值部分為絕對值相除x^* / y^*
小數定點除法x^* < y^* 整數定點除法x^* > y^*
被除數不等于0,除數不能為0
5.3.1 恢復余數法
恢復余數法運算規則
例題:
x=-0.1011 y=-0.1101 求[x/y]原
解:[x]原=1.1011
[y]原=1.1101
[y^* ] 補=0.1101
[-y ^* ]補=1.0011
做減法目的:試探上商為1還是0
所有x^* / y^*=0.1101
[x/ y]原=0.1101
一共進行了5次上商,4次移位,第一次上商判斷是否發生溢出:
若在小數定點機中,第一次上商上1,說明發生溢出,商的值大于1,所有只能表示絕對值小于1的數
特點:
余數為正:上商1
余數為負,上商0,恢復余數
5.3.2 不恢復余數法(加減交替法)
不恢復余數法運算規則(加減交替)
例題:
x=-0.1011 y=-0.1101 ,求[x/y]原
解:[x]原=1.1011 [y]原=1.1101 [y*]補=0.1101 [-y*]補=1.0011
符號位x=1與y=1異或得到為0
x^* / y^*=0.1101
[x/y]原=0.1101
特點:
上商n+1次
第一次上商判斷是否溢出(判斷被除數和除數直接的大小關系)
在小數定點機中,被除數的絕對值大于除數的絕對值,第一次上商為1就發生了溢出,移位n次,直到第一次上商處于最后一位的商的值移到符號位的位置;做了n+1次加法
用移位的次數判斷除法是否結束
總結
以上是生活随笔為你收集整理的定点数(fixed-point number)的运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1147 Heaps
- 下一篇: 牛客网dp专题 数位dp