浮点数运算中的舍入问题

前面讲到了浮点数计算时候的步骤:对阶,尾数求和,规格化。没有细细研究舍入的问题。

需要提出的是,阶码是小的向大的看齐,因此尾数求和阶段只有右移,没有左移。在规格化阶段,尾数超过加和溢出,需要右移。高位不是1的时候就左移。
左移,阶码要-1,右移,阶码要+1.
我以为自己懂了,但是真的遇到问题,才发现有一处不明,导致全盘皆不明。

书上提供了两种舍入的方法,一种是0舍1入法,一种是恒置1法。

具体解释是这样。

0舍1入法:尾数右移时,被移去的最高位数值为0,则舍去;被移去的最高位数值为1,则在末位加1.这样可能导致尾数溢出,因此还需要再右归。

我难以理解这个概念:什么是被移去的最高位?惶恐不安许久,终于明白,原来指的是:右移的时候,低位将被舍弃,因为位置有限,既然是右移,自然最右边的数位先丢掉。
假设补码表示。规则是左0右1,即:左移低位补0,右移高位补1.
1.01010101右移一次,被丢弃的位是1,这个时候被遗弃的最高位是谁?当然是1,因为只有一位。根据0舍1入的规则,尾数末尾需要加1.
保存的数位是:1.10101010 + 0.00000001 = 1.10101011
再右移一次,被丢弃的数位就有两位了,11。这个时候最高位就是1,所以,本次右移仍然需要在尾数最末尾加1.

需要额外说明的是,做高位一般多是指左边的位置。

也许这对你来说,根本不必加以总结,但是对我而言,我困惑了一段时间,所以,特别提出来,希望对你也有一点点价值。

恒置1法就不用说了,每一次右移,都在尾数的末尾加1.

还有,这里不知道你有没有体会到,右移,是一次一次进行。比如要右移三次,那么就有可能尾数加了三次1. 而不是看一下移动三位,最高位是1才加一个1. 如果这个理解出粗,我会回来修正的。

以上。

首先,我们需要将X和Y转换为双符号位法表示。 对于X= (0.3125) *2^-3,我们可以将其表示为: 符号位:0(因为X为正数) 阶码:011(-3的二进制表示为011) 尾数:1000(0.3125的二进制表示为0.0100,补齐4位为1000) 因此,X的双符号位法表示为0 011 1000。 同样地,对于Y=(-0.875) *2^-4,我们可以将其表示为: 符号位:1(因为Y为负数) 阶码:100(-4的二进制表示为100) 尾数:1100(0.875的二进制表示为0.111,补齐4位为1100) 因此,Y的双符号位法表示为1 100 1100。 接下来,我们需要进行规格化操作,即让两个数的阶码相等。由于Y的阶码较大,我们需要将X的阶码增加,同时将尾数右移相应的位数,直到阶码相等为止。 具体操作如下: 1. 将X的阶码增加1,变为100(-2的二进制表示为100),同时将尾数右移1位,变为0100。 2. 将X的阶码再增加1,变为101(-1的二进制表示为101),同时将尾数右移2位,变为0010。 现在,X和Y的阶码相等,都为101。接下来,我们可以进行减法操作,得到结果M。 首先,我们需要将Y的尾数取反,并加上1,表示-Y: -Y = 0011 然后,我们将X和-Y进行加法操作,得到M: X + (-Y) = 0010 注意,这里我们采用了01法,即如果小数点后第5位是0,则去后面的位数;如果是1,则将第4位加1。在本例,X的尾数为0010,-Y的尾数为0011,相加后得到结果为0101。因为第5位是0,所以我们只需要保留前4位,即0101。 最后,我们需要将M表示为分式形式,并化简。具体操作如下: 1. 将M的尾数转换为十进制数,得到5。 2. 将阶码101转换为十进制数,得到5。 3. 将5表示为2的幂,得到2^2。 因此,最终结果为: X - Y = 0.3125 - (-0.875) = 1.1875 * 2^-2 其,1.1875表示为二进制数1.0011,阶码为101,尾数为0011。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值