符號定點二進制小數(Qn format)乘法原理


整個內容搬運來自:https://www.allaboutcircuits.com/technical-articles/multiplication-examples-using-the-fixed-point-representation/

https://www.allaboutcircuits.com/technical-articles/fixed-point-representation-the-q-format-and-addition-examples/ 直接看原貼挺好,我復讀一遍

 

 

無符號整數二進制乘法很簡單,基本上就是補位到位數相同,然后乘數中的每一位與另一個乘數的每一位做AND(與)運算,然后移位累加就可以了。

 

 

那么把無符號二進制整數乘法拓展到無符號二進制小數乘法,就涉及小數格式的問題。這里說定點二進制小數格式:Qn format;小數點位於第 n 位元之右側,稱為Qn 格式。Q3.3就是3位整數3位小數。

乘數A是Qm.n整數部分m位,小數部分n位; 乘數B是Qo.p,整數部分o位,小數部分p位;那么積A*B 就是Q(m+o).(n+p),整數部分(m+o)位,小數部分(n+p)位;按照無符號二進制整數乘法進行,然后把輸出從低到高按照位數划分整數和小數部分就可以得到正確的結果。

 

 

現在把無符號二進制整數乘法拓展到考慮符號的整數二進制乘法,這就涉及二進制符號位,補位的問題了。考慮符號二進制整數,最高位是符號位,1表示負數,0表示正數負數的補碼是所有位取反(反碼)然后加1正數的補碼是正數本身。

1111是負數,它表示-1,它的補碼是0001(反碼加一后最高位溢出舍去),所以負數二進制的數值是補碼視為正數的相反數。符號位權位-2^(n-1)——n為二進制數的位數,計算符號二進制數的十進制也可以用權來計算。

(1111)2=1*(-2^3)+1*2^2+1*2^1+1*2^0=-8+4+2+1=-1;

另外還需強調一點,就是符號二進制數的補位。我們都知道不同位數無符號二進制數進行運算需要在位數小的數前面補0,例如無符號數1011和100相加,變成1011和0100相加,因為顯然,100和0100, 00100, 000100都是相等的,高位補0產生0*2^(n),不對原始數值有影響。

但是負數二進制數的補位是要在高位補1:直接解釋,假設僅要增補1位,如果不是1就改變了負數為正數。由此遞推到補n位,都是補1;也可以從權的角度來說明……

 符號二進制數的計算需要考慮每個乘數分別的符號,可以分為:正數*正數,正數*負數,負數*正數,負數*負數

正數*正數:正常運算就行了,依次與然后移位累加。

正數*負數:負數的最后一位(最高位,也就是符號位)與正數乘法時,需要取反碼加1然后最高位補一位1;示意圖:

 

 上圖這里01001是正數,10010是負數,負數從低位開始直到最后一位之前(第3行到第6行),都是正常的與運算然后移位;當最后一位(第7行)時直接把正數取反加1 (01001 變為10111),並補一位1 (10111變為110111,因為5位*5位,應該是10位,補1補到10位)。到此再進行累加,就可以得到正數*負數的結果。

負數*正數:正常進行正數的每一位與負數與運算,然后移位排列,如果正數某一位是1,那么這次結果要在累加前高位補1;示意圖:

 

 上圖這里101001是負數,100010是正數,實際上應該是1101001和0100010做乘法,但是事先聲明100010是正數了。遇到正數某一位是1的情況,把這一次的結果在累加前高位補1(第4行,第8行),其余正常補0,最后累加就得到正確結果。

負數*負數:遇到被乘負數某一位有1,那么這次結果在高位補1;直到最后一位,取補碼高位補0;示意圖:

 

 上圖11001和10010都是負數,當被乘數10010遇到某一位是1時(第4行),把這一位的結果進行高位補1;直到最后一位,把乘數(11001)取補碼(11001到00111),然后不滿足位數就補0(00111到000111,5位*5位是10位,結果超過10位就溢出舍去),再累加就得到正確結果。這里建議手寫一下11*11也就是(-1)*(-1)

如果m位符號二進制整數*n位符號二進制整數,結果應該是2*max(m,n)位,高位舍去。

 

 

現在進入正題,討論符號定點二進制小數的乘法,小數格式依然是Qn format,按照上文符號整數二進制乘法進行,然后:乘數A是Qm.n  符號位1位,整數部分m-1位,小數部分n位; 乘數B是Qo.p,符號位1位,整數部分o-1位,小數部分p位;那么積A*B 就是Q(m+o).(n+p),整數部分(m+o-2)位,小數部分(n+p)位,剩下高位都是補位的符號位;按照符號二進制整數乘法進行,然后把輸出從低到高按照位數划分整數和小數部分就可以得到正確的結果。這里建議手寫一下1.1*1.1也就是(-0.5)*(-0.5)

 

可以直接看開頭提到的原貼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM