定点数的乘除运算

定点数的乘法运算

在计算机中,乘法运算由累加和右移操作实现。根据机器数的不同分为原码一位乘法和补码一位乘法。

原码一位乘法

符号位和数值位是分开求的
乘积符号由两个数的符号位异或形成,
乘积数值部分则是两个数的绝对值相乘之积

手算模拟

符号位:Ps = As ⊕ Bs = 0 ⊕ 0 = 0
手算模拟(二进制)
手算模拟(二进制)
(乘数)0.1011 = 1 * 2-1 + 0 * 2-2 + 1 * 2-4
(被乘数)0.1101 = 1101 * 2-4
0.1101*1.1011=(1101 * 1 * 2-8)+(1101 * 1 * 2-7)+(1101 * 1 * 2-5)用移位实现
【例题】设机器字长为n+1=5位,[x]=1.1101,[y]=0.1011,用原码一位法求x·y。
在这里插入图片描述
正式进行乘法运算之前ACC置为0
当前MQ最低位为1,ACC加上被乘数;当前位为0,ACC加上0。
上图当前位就为1,则ACC应加上被乘数01101,这个运算由ALU即算法逻辑单元里的加法电路实现的,相加的结果会放在ACC寄存器里面(ACC)+(X)—> ACC 00000+01101=01101
然后求下一个位积,由于手动计算时需错位,计算机将ACC和MQ里的数字统一逻辑右移一位,高位补零,此时ACC=00110 MQ=10101;同上当前MQ最低位为1,(ACC)+(X)–>ACC 00110+01101=10011

运算法则:先加法再位移,重复n次数值位有几位就重复几次
红色部分为“部分积”
乘数的符号位不参与运算
修改符号位xs⊕ys= 1⊕0=1
在这里插入图片描述
在这里插入图片描述

运算时可能出现绝对值大于1的情况(但此刻结果并未溢出),部分积和被乘数取双符号位
、、、、、、、、手算模拟、、、、、、、、
手算模拟

补码一位乘法(Booth算法)

进行n轮,加法、移位运算,最后多来一次加法
每次加法可能+0、+[x]、+[-x]
每次移位是"补码的算数右移"
符号位参与运算补码一位乘法
辅助位 - MQ中最低位 = 1时,(ACC)+[x]
辅助位 - MQ中最低位 = 0时,(ACC)+0
辅助位 - MQ中最低位 = -1时,(ACC)+[-x]
补码的算数右移:符号位不动,数值位右移;正数右移补零,负数右移补1(符号位是啥就补啥)

定点数的除法法运算

“累加”–“左移”

原码除法运算

商符和商值分开进行运算。
商符:符号位“异或”形成。Qs=xs⊕ys
商值:|Q|=|x|/|y|

恢复余数法

设机器字长为5位,(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复除数法求x/y.

在这里插入图片描述

在这里插入图片描述
求余数:ACC-(除数)——>ACC
不恢复余数法

不恢复余数法

求|Q|。
1.符号位不参加运算。
2.被除数减去除数(|x|-|y|=|x|+(-|y|)=|x|+[-|y|]
余正商上1,余商左移1,再减去除数
余负商上0,余商左移1,再加上除数

3.当第n+1步余数为负,需加上|y|得到第n+1步正确的余数。(余数和被除数同号)在这里插入图片描述

正数原码补码相同
正数原码补码相同。

补码除法运算(加减交替法)

双符号位表示
加减交替:
1.符号位和数值位一起参加运算,商符自然形成。数值均用补码表示
2.被除数和除数符号决定第一步做加法还是减法:
被除除同号,被除减除数
被除除异号,被除加除数

3.余除同号商上1,余左移1减除数
余除异号商上0,余左移1加除数

4.重复执行第3步操作n次
5.若对商的精度没有特殊要求,则一般采用”末位恒置1“

总结

在这里插入图片描述

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言是一种常用的编程语言,可以用于实现定点数据的运算。在C语言中,我们可以使用整数类型变量来表示定点数据,并通过一定的算法来进行运算。 定点数据是一种用定点表示的小数,它没有浮点数的精度问题,适用于一些对精度要求不高的计算。在C语言中,我们可以通过将小数转换为整数,并在计算中保持小数点的位置来实现定点数据的运算。 首先,我们需要选择一个合适的定点数据表示格式。常用的有固定小数点表示法和整数比例表示法。在固定小数点表示法中,我们将小数点固定在某个位置上,如将后n位作为小数部分;而在整数比例表示法中,我们以某个整数为基准,将小数转换为整数,并通过除以该基准数来还原出小数值。 其次,我们需要实现定点数据的运算算法。对于加法和减法,我们只需要对两个定点数进行普通的整数运算即可。而乘法和除法则需要特殊处理。对于乘法,我们可以通过两个定点数的整数部分相乘,并将小数部分相加;对于除法,我们可以将两个定点数整体放大一定倍数,然后再进行整数除法运算。 最后,我们需要在程序中编写相应的代码实现定点数据的运算。通过定义合适的变量类型和使用适当的运算符,我们可以进行定点数的加减乘除运算,并得到正确的结果。 总结来说,C语言可以通过将小数转换为整数,并使用一定的计算算法,实现定点数据的运算。这为一些对精度要求不高的应用提供了一种简单有效的计算方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值