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