四、浮点四则运算
机器中的任何一个浮点数可以写成
1.浮点加减运算
浮点数加减运算必须按以下几步进行:
- 对阶,使两数的小数点位置对齐。
- 尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)。
- 规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化。
- 舍入,为提高精度,要考虑尾数右移时丢失的数值位。
- 溢出判断,即判断结果是否溢出。
对阶
对阶的目的是使两操作数的小数点位置对齐,即使两数的阶码相等。首先要求出阶差,再按小阶向大阶看齐的原则,使阶小的尾数向右移位,每右移一位,阶码加1,指导两数的阶码相等为止。右移的次数正好等于阶差。尾数右移时可能会发生数码丢失,影响精度。
尾数求和
将对阶后的两个尾数按定点加(减)运算规则进行运算。
规格化
当基值r=2时,尾数S的规格化形式为
12≤|S|<1
1
2
≤
|
S
|
<
1
(4-1)
如果采用双符号位的补码,则
当 S>0 S > 0 时,其补码规格化形式为 [S]补=00.1××…× [ S ] 补 = 00.1 × × … × (4-2)
当 S<0 S < 0 时,其补码规格化形式为 [S]补=11.0××…× [ S ] 补 = 11.0 × × … × (4-3)
当尾数的最高数值位与符号位不同时,即为规格化形式。但对S<0时有两种情况需要特殊处理:
- S=−12 S = − 1 2 ,则 [S]补=11.100…0 [ S ] 补 = 11.100 … 0 。此时对于真值 −12 − 1 2 而言,它满足(4-1)式,对于补码而言,它不满足式(4-3)。为了便于硬件判断,特规定 −12 − 1 2 不是规格化的数(对于补码而言)。
- S=−1 S = − 1 ,则 [S]补=11.00…0 [ S ] 补 = 11.00 … 0 ,因小数补码允许表示-1,故-1视为规格化的数。
规格化又分为左规和右规。
(1)左规
当尾数出现 00.0××…× 00.0 × × … × 或 11.1××…× 11.1 × × … × 时,需要左规。左规时尾数左移一位,阶码减1,直到符合式子(4-2)或(4-3)为止。
(2)右规
当尾数出现 01.××…× 01. × × … × 或 10.××…× 10. × × … × 时,表示尾数溢出,这在加减运算中是不允许的,但在浮点运算中这不算溢出,可通过右规处理。右规时尾数右移一位,阶码加1。
舍入
在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响精度。为此可用舍入法来提高尾数的精度。常用的舍入方法有以下两种:
(1)“0舍1入”法
在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能使尾数又溢出,此时需再做一次右规。
(2)“恒置1”法
尾数右移时,不论丢掉的最高数值位是“1”或“0”,都使右移后的尾数末位恒置“1”。
溢出判断
与定点加减法一样,浮点加减运算最后一步也需判断溢出。当尾数之和出现 01.××…× 01. × × … × 或 10.××…× 10. × × … × 时,并不表示溢出,只有将此数右规后,再根据阶码来判断浮点运算结果是否溢出。
若机器数为补码,尾数为规格化形式,并假设阶符取2位,阶码的数值部分取7位,数符取2位,尾数的数值部分取n位,则它们能表示的补码在数轴上的表示范围如图所示。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/ff90073b9de2ed32b9b9b1f7b1008579.png)
它们所对应的真值如下:
A最小负数 2+127×(−1) 2 + 127 × ( − 1 )
B最大正数 2+127×(1−2−n) 2 + 127 × ( 1 − 2 − n )
a最大负数 2−128×(−2−1−2−n) 2 − 128 × ( − 2 − 1 − 2 − n )
b最小正数 2−128×2−1 2 − 128 × 2 − 1
a、b之间的阴影部分对应的阶码小于-128,这种情况称为浮点数的下溢。下溢时,浮点数值趋于零,故机器不做溢出处理,仅把它当作机器零。
A、B两侧的阴影部分对应的阶码大于+127,这种情况称为浮点数的上溢。此时,浮点数真正溢出,机器需停止运算,作溢出中断处理。一般说浮点溢出,均是指上溢。
浮点机的溢出与否可由阶码的符号决定,即
阶码
[j]补=01,××…×
[
j
]
补
=
01
,
×
×
…
×
为上溢。
阶码
[j]补=10,××…×
[
j
]
补
=
10
,
×
×
…
×
为下溢,按机器零处理。
2.浮点乘除法运算
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/5dfcfecb58bd364d723004f592f6b80d.png)
阶码运算
若阶码用补码运算,乘积的阶码为
[jx]补+[jy]补
[
j
x
]
补
+
[
j
y
]
补
,商的阶码为
[jx]补−[jy]补
[
j
x
]
补
−
[
j
y
]
补
。两个同号的阶码相加或异号的阶码相减可能产生溢出,此时应作溢出判断。
当做乘法运算时,积的阶码可用下式完成
当做除法运算时,商的阶码可用下式完成
进行移码加减运算时,只需将移码表示的加数或减数的符号位取反(即变成补码),然后进行运算,就可得阶和(或阶差)的移码。
如果在原有移码符号位的前面(即高位)再增加1位符号位,并规定该位恒用“0”表示,便能方便地进行溢出判断。溢出的条件是运算结果移码的最高符号位为1。此时若低位符号位为0,表示上溢;低位符号位为1,表示下溢。如果运算结果移码的最高符号位为0,即表明没有溢出。此时若低位符号位为1,表明结果为正;低位符号位为0,表示结果为负。
尾数运算
(1)浮点乘法尾数运算
两个浮点数的尾数相乘,可按下列步骤进行:
- 检测两个尾数中是否有一个为0,若有一个为0,乘积必为0,不再作其他操作;如果两尾数均不为0,则可进行乘法运算。
- 两个浮点数的尾数相乘可以采用定点小数的任何一种乘法运算来完成。相乘结果可能要进行左规,左规时调整阶码后如果发生阶下溢,则作机器零处理;如果发生阶上溢,则作溢出处理。此外,尾数相乘会得到一个双倍字长的结果,若限定只取1倍字长,则乘积的若干低位将会丢失。
如何处理丢好似的各位值,通常有两种方法:
1. 无条件地丢掉正常尾数最低位之后的全部数值,这种方法被称为截断处理,处理简单,但影响精度。
2. 按浮点加减运算讨论的两种舍入原则进行舍入处理。对于原码,采用0舍1入法时,不论其值是正数或负数,“舍”使数的绝对值变小,“入”使数的绝对值变大。对于补码,采用用0舍1入法时,若丢失的位不是全0,对正数来说,“舍”、“入”的结果与原码分析正好相同;对负数来说,“舍”、“入”的结果与原码分析正好相反,即“舍”使数的绝对值变大,“入”使数的绝对值变小。对负数的补码可采用如下规则进行舍入处理:
- 当丢失的各位均为0时,不必舍入。
- 当丢失的各位数中的最高位为0时,且以下各位不全为0,或丢失的各位数中的最高位1,且以下各位全为0时,则舍去被丢失的各位。
- 当丢失的各位数中的最高位为1,且以下各位又不全为0时,则在保留位数的最末位加1修正。
例:已知
x=2−101×0.0110011
x
=
2
−
101
×
0.0110011
,
y=2011×(−0.1110010)
y
=
2
011
×
(
−
0.1110010
)
,求
x⋅y
x
⋅
y
。
解:
[x]补
[
x
]
补
=11,011;00.0110011
[y]补
[
y
]
补
=00,011;11.0001110
[jx+jy]移=[jx]移+[jy]补=00,011+00,011=00,110
[
j
x
+
j
y
]
移
=
[
j
x
]
移
+
[
j
y
]
补
=
00
,
011
+
00
,
011
=
00
,
110
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/109f965edc65ae6b48b39d00f73b1411.png)
尾数相乘结果为 [Sx⋅Sy]补 [ S x ⋅ S y ] 补 =11.10100101001010,需左规,即
尾数为负,按负数补码的舍入规则,取1倍字长,丢失的7位为0010100,应“舍”,故最终结果为
(2)浮点除法尾数运算
两个浮点数的尾数相除,可按下列步骤进行:
- 检测被除数是否为0,若为0,则商为0;再检测除数是否为0,若为0,则商为无穷大,另作处理。若两数均不为0,则可进行除法运算。
- 两浮点数尾数相除同样可采取定点小数的任何一种除法运算来完成。对已规格化的尾数,为了防止除法结果溢出,可先比较被除数和除数的绝对值,如果被除数的绝对值大于除数的绝对值,则先将被除数右移一位,其阶码加1,再做尾数相除。此时所得结果必然是规格化的定点小数。
例:按补码浮点运算步骤,计算
[25×(+916)]÷[23×(−1316)]
[
2
5
×
(
+
9
16
)
]
÷
[
2
3
×
(
−
13
16
)
]
解:令
x=25×(+916)=2101×0.1001
x
=
2
5
×
(
+
9
16
)
=
2
101
×
0.1001
令
y=23×(−1316)=2011×(−0.1101)
y
=
2
3
×
(
−
13
16
)
=
2
011
×
(
−
0.1101
)
所以
[x]补=00,101;00.1001
[
x
]
补
=
00
,
101
;
00.1001
[y]补=00,011;11.0011
[
y
]
补
=
00
,
011
;
11.0011
,
[−Sy]补=00.1101
[
−
S
y
]
补
=
00.1101
[jx]补−[jy]补=00,101−00,011=00,101+11,101=00,010
[
j
x
]
补
−
[
j
y
]
补
=
00
,
101
−
00
,
011
=
00
,
101
+
11
,
101
=
00
,
010
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/db37c596afca7153bc1cc585d21b0032.png)
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/0c1f82c6f2210287b29e42ba8286b45a.png)
所以,
SxSy=1.0101
S
x
S
y
=
1.0101
尾数相除结果已为规格化数。所以
3.浮点运算所需的硬件配置
浮点运算器主要由两个定点运算部件组成。一个是阶码运算部件,用来完成阶码加、减,以及控制对阶时小阶的尾数右移次数和规格化时对阶码的调整;另一个是尾数运算部件,用来完成尾数的四则运算以及判断尾数是否已规格化,此外还需判断运算结果是否溢出的电路等。
现代计算机可把浮点运算部件做成独立的选件,或称为协处理器。