【计算机组成原理】浮点加减运算(简洁易懂)


title: 浮点加减运算
date: 2023-10-17
tag: 计算机组成原理


浮点加减运算

浮点加减运算一般采用补码表示的浮点加减运算。

普遍的,运算对于两个浮点数:
X = 2 m ∗ M x , Y = 2 n ∗ M y X = 2^m * M_x ,Y = 2^n*M_y X=2mMx,Y=2nMy
在运算中如果m和n相同,我们称两数同阶,加法计算时,只需将m和n相加,尾码单独进行加法计算即可,需要注意的是结果必须以规格化形式出现,因此需要规格化处理

另外,当两数的阶码不同时,我们需要进行对阶操作。

对阶

对阶的选择

显然地,我们对阶有两种情况,然而,当我们用大阶对小阶时,尾数部分左移动,高位部分被舍弃的话会对结果造成巨大影响,所以我们统一选择小阶对大阶的方法。这样我们舍去的就是较小的低位部分,对精度影响较小。

求阶位差

求m-n的值

调整尾数

  • 若m-n<0,将Mx→移动m-n位;
  • 若m-n>0,将My→移动n-m位。

注意将移动后多出的位数保留,称为保留附加位,保留附加位加入中间运算能够提高精度,在十进制运算中,我们一般也先算再取近似值,这是一样的经验。

特别地,再IEEE754标准中,通常有3个保留位,从左到右依次是保护位,舍入位,粘位;舍入位右侧有非0数,那么粘位就为1,否则为0 。

尾数运算

移位之后的尾数,按照定点数的补码加减运算法则执行加减操作。

结果规格化

上溢(右规格化)

解决:右规格化

当尾数符号位(双符号位)不同时,则表示尾数上溢出(顾名思义就是尾数向符号位进位了)。

如果符号位为10或01,将尾数位依次→移1位,阶码位加1即可;注意10右移在左边添加1。

左规格化

当尾数运算结果为11.1…或者00.0…需要左规,这个很好理解,左移直到出现11.0…或者00.1…,移动多少位,那么阶码就减多少。

舍入

末位恒置1法

如果右规多出的位数中至少存在一个1,那么无论最低位是0还是1,都变成1。

0舍1入法

如果最低位后一位是0,则舍弃,如果为1,则向末位进一。

溢出判断

当阶码为10或者01时表示溢出。

举例

1.设
X = 2 − 101 ∗ ( − 0.101011 ) , Y = 2 − 010 ∗ ( 0.001110 ) X = 2^{-101} *(-0.101011), Y = 2^{-010} *(0.001110) X=2101(0.101011),Y=2010(0.001110)
假设数的阶码为3位,均用补码表示,计算X+Y.

按照步骤一步步来:

首先将两数用补码形式表示出来(采用双符号位):


[ X ] 补码 = 11011 , 11.010101 , [ Y ] 补码 = 11110 , 00.001110 [X]_{补码} = 11011,11.010101, [Y]_{补码} = 11110,00.001110 [X]补码=1101111.010101,[Y]补码=1111000.001110

  • 对阶

[ Δ E ] 补码 = [ E x ] 补码 + [ − E y ] 补码 [\Delta E]_{补码} = [Ex]_{补码}+[-Ey]_{补码} [ΔE]补码=[Ex]补码+[Ey]补码

结果为11011+00010 = 11101 = -3 < 0;

所以X需要右移3位,阶码加3,右移之后的X补码为11110,11.111010(101),在之后的运算中,保留位参加运算。

  • 尾数运算

[ X ] 补码 + [ Y ] 补码 = 11110 , 00.0011000 ( 101 ) [X]_{补码} + [Y]_{补码} = 11110,00.0011000(101) [X]补码+[Y]补码=11110,00.0011000(101)

  • 规格化处理

    由于尾数部分结果为00.00…,需要进行左规处理,向左边移动两位,结果为11110,00.1100010(1).

  • 舍入处理:采用0舍1入法,为11110,00.1100011;采用末位恒置1法,最低位之后有1,则结果位11110,00.1100011.

  • 溢出判断:阶码符号位位11,没有溢出。

最终结果为:
2 − 010 ∗ 0.100011 2^{-010}*0.100011 20100.100011

再次举例


X = 2 7 ∗ ( 25 / 32 ) , Y = 2 6 ∗ ( − 23 / 32 ) X = 2^7*(25/32),Y=2^6*(-23/32) X=27(25/32),Y=26(23/32)
当阶码为5为(用双符号位)尾数位7位(用双符号位),用补码二进制浮点运算方法计算X-Y(采用0舍1入法)。

首先说一下这个换成二进制数,

27是十进制表示,表示成二进制为2111(7D = 111B),25D= 11001B,除以32,32为2^5,x11001向左移动5位,所以X = 2^111* (0.11001),同理Y=2^110* (0.10111)
[ X ] 补码 = 00111 , 00.11001 , [ − Y ] 补码 = 00110 , 00.10111 [X]_{补码} = 00111,00.11001, [-Y]_{补码} = 00110,00.10111 [X]补码=00111,00.11001[Y]补码=00110,00.10111

  • 对阶:

[ Δ E 补码 ] = [ E x ] 补码 + [ − E y ] 补码 = 00001 [\Delta E_{补码}] = [E_x]_{补码} + [-E_y]_{补码} = 00001 [ΔE补码]=[Ex]补码+[Ey]补码=00001

Y的尾数向右移动1位,移动之[Y]_补码 = 00111,00.11011(1)

  • 尾数运算:

[ X − Y ] 补码 = 00111 , 01.00100 ( 1 ) [X-Y]_{补码} = 00111,01.00100(1) [XY]补码=0011101.00100(1)

  • 结果规格化:

发生上溢出,右规1位,变为00.10010(01),阶码加1,为01000,00.10010(01)

  • 溢出判断:

    阶码符号位为01,发生溢出。

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值