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=2m∗Mx,Y=2n∗My
在运算中如果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=2−101∗(−0.101011),Y=2−010∗(0.001110)
假设数的阶码为3位,均用补码表示,计算X+Y.
按照步骤一步步来:
首先将两数用补码形式表示出来(采用双符号位):
[
X
]
补码
=
11011
,
11.010101
,
[
Y
]
补码
=
11110
,
00.001110
[X]_{补码} = 11011,11.010101, [Y]_{补码} = 11110,00.001110
[X]补码=11011,11.010101,[Y]补码=11110,00.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
2−010∗0.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) [X−Y]补码=00111,01.00100(1)
- 结果规格化:
发生上溢出,右规1位,变为00.10010(01),阶码加1,为01000,00.10010(01)
-
溢出判断:
阶码符号位为01,发生溢出。