定点乘法原理

定点乘法原理

原码一位乘法

原码的一位乘与十进制计算乘法过程类似,只不过在存储方式上有一些技巧。因为两个n位乘数相乘得到的数应该是2n位,但是考虑到每对于乘数的每一位,我们读取并判断后都不会再使用,因此可以将其舍去;而恰好乘数部分需要一个新的位来进行位权的改变,因此我们可以利用乘数寄存器进行辅助存储。同时,移位操作也可以让判断电路固定在一个位置,有利于简化电路。

原码一位乘的具体过程如下图所示

可以看到,C就是乘数寄存器,而A称为部分积,最后计算完成后合并在一起,再补上符号位则得到原码的乘积

原码两位乘法

原码两位乘的原理也很简单,因为源码实际对于两位的情况只有4中并且不区分正负数,计算方法一致,如下表所示

Yi+1Yi 操作 部分积和乘数右移
00 +0 1位
01 +X 1位
10 +2X 1位
11 +3X 1位

但是上表存在一个问题,他的行为中不变、+X、+2X(移位后加)都可以方便的通过一步完成,但是+3X则需要拆解成两步,如果拆解成两步,那么对硬件设计和程序执行效率都会产生严重的负面影响。
所以我们实际采用的方法是将+3X分解为+4X-X,这样的话就能解决这个问题了,因为+4X又可以通过左移两位快速实现。
现在的问题变为-X怎么处理,当即再做一次加法显然不合适,因此我们引入一个标志位C进行存储,C=1表示我们欠下一个+4X,这样下一次计算时计算机就会补上一个+4X。进行右移2位后,+4X就变成了+X,因此计算大大简化了。
那么我们就可以将操作表扩展成如下模式

Yi+1Yi C 部分积 C置数 部分积和乘数右移
000 +0 0C 2位
001 +X 0C 2位
010 +X 0C 2位
011 +2X 0C 2位
100 +2X 0C 2位
101 -X 1C 2位
110 -X 1C 2位
111 +0 1C 2位

如果遇到奇数位乘法,最后一位按照一位乘处理。

最后给出一个例子:

补码一位乘法

前置知识

补码的乘法我们选用纯小数作为推导的例子,因为纯小数具有一个非常优秀的性质:[X]=[X](mod 2)
证明:
对于纯小数,其补码转化为真值的公式为:[X]=2+X(mod 2)
在模2条件下,可以对数加上任意2k,因此[X]=2X(mod 2)=(X+2)(mod 2)=[X]

矫正法

结论:[X×Y]=[X]×(0.Y1Y2Yn)+[X]×Y0
其中,Y0为符号位
 
 
证明:
对于被乘数X而言,其实不影响运算,因为X始终作为加数而判断是否要加的是Y,因此只有Y的正负会影响计算方法。
(1)Y>0时,显然与原码乘法计算方法相同,公式的第二项为0
(2)Y<0时
假设

[Y]=1.Y1Y2Yn=Y+2

Y=[Y]2=0.Y1Y2Yn1

此时我们发现,Y被表示成了一个正数减去1的形式,那么

[X×Y]=[X×(0.Y1Y2Yn)X]=[X×(0.Y1Y2Yn)][X]

 
综上所述,得到[X×Y]=[X]×(0.Y1Y2Yn)+[X]×Y0

booth公式

[X×Y]=[X]×(0.Y1Y2Yn)+[X]×Y0

[X×Y]=[X]×(0.Y1Y2Yn)+[X]×Y0       =[X]×(Y0+21Y1+22Y2++2nYn)       =[X]×(Y0+(Y121Y1)+(21Y222Y2)++(2n+1Yn2nYn)  )       =[X]×( (Y1Y0)+21(Y2Y1)+22(Y3Y2)++2n(Yn+1Yn) )       Yn+1=0

拆解为递推公式则为

[Z0]=0[Z1]=21{[Z0]+(Yn+1Yn)[X]}[Zn]=21{[Zn1]+(Y2Y1)[X]}[X×Y]=[Zn]+(Y1Y0)[X]

booth乘法运算按照:
(1)在乘数Y后附加一位,初始值Yn+1=0
(2)每次运算后部分积和乘数均右移一位,操作由Yn1Yn决定,且

Yn1Yn 部分积 部分积和乘数右移
00 +0 1位
01 +[X] 1位
10 [X] 1位
11 +0 1位


例:1.00xxxx + 1.01xxxx的情况就会出现溢出错误,如果采用单个符号位,进行算术右移后会导致出错;此时应当采用11.00xxxx + 11.01xxxx保证符号位正常

补码两位乘法

与原码两位乘类似,补码两位乘也是同时进行两次乘法运算,设上次、第一次与第二次的部分积分别为[Z][Z][Z]


[Z]=21{[Z]+(Yi+1Yi)[X]}[Z]=21{[Z]+(YiYi1)[X]}[Z]=21{21{[Z]+(Yi+1Yi)[X]}+(YiYi1)[X]}[Z]=22{[Z]+(Yi+1+Yi2Yi1)[X]}

由此可见两位乘由Yi+1,Yi,Yi1三位共同决定操作
写成下表形式

Yn1YnYn+1 部分积运算 部分积和乘数右移
000 +0 2位
001 +[X] 2位
010 +[X] 2位
011 +2[X] 2位
100 2[X] 2位
101 [X] 2位
110 [X] 2位
111 +0 2位

【!!!】关于补码两位乘特别需要注意符号位的处理累加次数

  1. 部分积和被乘数的符号位设置为3位
  2. 乘数符号位分奇偶讨论
    设n是乘数的数值部分的位数

(1)n为偶数


乘数符号位:2位
累加次数:n2+1
移位次数:n2

(2)n为奇数


乘数符号位:1位
累加次数:n+12
移位次数:n+12(最后一次只移1位)

 
 
 

参考资料

https://wenku.baidu.com/view/b43fe4fd0242a8956bece412.html
https://blog.csdn.net/qq_42898299/article/details/118446418
https://blog.csdn.net/qq_45757722/article/details/111466747

posted @   Artlesbol  阅读(684)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示