第三章 计算机的运算方法
§ 1 各种进位制及其转换
1、二进制、八进制、十六进制之间的转换
2、十进制向其它进制的转换
§ 2 真值、机器码、原码、反码、补码、移码?
真值:一个数本身。 例如,+1100
机器码:正负号也用 0,1表示的真值原码:机器码反码:对正数来说,其反码和原码的形式相同对负数来说,反码为其原码的数值部分的各位取反补码:对正数来说,其补码和原码的形式相同对负数来说,补码为其原码的数值部分的各位取反后(反码),在未位加 1。
移码:在补码的最高位加 1。
补码和移码的数值部分相同,而符号位相反,
小结,上面的数据四种机器表示法中,移码表示法主要用于表示浮点数的阶码。由于补码表示对加减法运算十分方便,因此目前机器中广泛采用补码表示法。在这类机器中,数用补码表示,补码存储,补码运算。也有些机器,数用原码进行存储和传送,运算时改用补码。还有些机器在做加减法时用补码运算,在做乘除法时用原码运算。
§ 3,数据格式计算机中常用的数据表示格式有两种,
一是 定点格式,二是 浮点格式。
一般来说,定点格式容许的数值范围 有限,
但要求的处理硬件比较 简单 。
浮点格式容许的数值范围 很大,但要求的处理硬件比较 复杂 。
3.1,定点数的表示方法定点表示,约定机器中所有数据的小数点位置是固定不变的。
由于约定在 固定 的位置,小数点就不再使用记号,.”来表示。
通常将数据表示成 纯小数 或 纯整数 。
定点数 x=x 0 x 1 x 2 … x n 在定点机中表示如下 (x 0:符号位,0代表正号,1代表负号 ):
纯小数 的表示范围为 (x 0 x 1 x 2 … x n 各位均为 0时最小;各位均为 1时最大 )
0≤|x |≤1- 2- n (3.1)
纯整数 的表示范围为
0≤|x |≤2n- 1 (3.2)
目前计算机中多采用定点纯整数表示,因此将定点数表示的运算简称为 整数运算 。
3.2,浮点数的表示方法,电子的质量 (9× 10- 28克 )和太阳的质量 (2× 1033克 )相差甚远,在定点计算机中无法直接来表示这个数值范围,要使它们送入定点计算机进行某种运算,必须对它们分别取不同的比例因子,
使其数值部分绝对值小于 1,即:
9 × 10- 28= 0.9 × 10- 27
2 × 1033= 0.2 × 1034
这里的比例因子 10- 27 和 1034要分别存放在机器的某个存储单元中,以便以后对计算结果按这个比例增大。显然这要占用一定的存储空间和运算时间。
浮点表示法,把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示,这种把数的范围和精度分别表示的方法,数的小数点位置随比例因子的不同而在一定范围内自由浮动。
任意一个十进制数 N 可以写成
N = 10E.M (3.3)
同样,在计算机中一个任意进制数 N 可以写成
N=R e.m (3.4)
N=R e.m (3.4)
m,尾数,是一个纯小数。
e,比例因子的指数,称为浮点的 指数,是一个整数。
R,比例因子的 基数,对于二进计数值的机器是一个常数,
一般规定 R 为 2,8或 16。
一个机器浮点数由 阶码 和 尾数 及其 符号位 组成,
尾数,用定点小数表示,给出有效数字的位数决定了浮点数的表示精度;
阶码,用整数形式表示,指明 小数点 在数据中的位置,决定了浮点数的表示范围。):
为便于软件移植,按照 IEEE754 的标准,
32位浮点数的标准格式为,
32位的浮点数中,
S,浮点数的符号位,1 位,0表示正数,1表示负数。 M,
尾数,23位,用小数表示,小数点放在尾数域的最前面。
E,阶码,8 位阶符采用隐含方式,即采用移码方式来表示正负指数。
移码方法对两个指数大小的比较和对阶操作都比较方便,因为阶码域值大者其指数值也大。
[例 1]浮点数 x 的二进制存储格式为 (41360000)16
按照 IEEE754 的标准,64位浮点数的标准格式为,
64位的浮点数中,
S,浮点数的符号位,1 位,0表示正数,1表示负数。
M,尾数,52位,用小数表示,小数点放在尾数域的最前面。
E,阶码,11位阶符采用隐含方式,即采用移码方式来表示正负指数。
3.3 补码加减法
1.原码除法运算原理两个原码表示的数相除时,商的符号由两数的符号按位相加求得,
商的数值部分由两数的数值部分相除求得。
5.除法下面仅讨论数值部分的运算。设被除数 x = 0.1001,除数 y = 0.1011,模仿十进制除法运算,
以手算方法求 x ÷ y 的过程如下,
0.1 1 0 1 商 q
0.1 0 1 1 0.1 0 0 1 0 x (r0) 被除数小于除数,商 0
- 0.0 1 0 1 1 2- 1y 除数右移 1位,减除数,商 1
0.0 0 1 1 1 0 r1 得余数 r1
- 0.0 0 1 0 1 1 2- 2y 除数右移 1位,减除数,商 1
0.0 0 0 0 1 1 0 r2 得余数 r2
- 0.0 0 0 1 0 1 1 2- 3y 除数右移 1位,不减除数,商 0
0.0 0 0 0 1 1 0 0 r3 得余数 r3
- 0.0 0 0 0 1 0 1 1 2- 4y 除数右移 1位,减除数,商 1
- 0.0 0 0 0 0 0 0 1 r4 得余数 r4
得 x ÷ y 的商 q= 0.1101,余数为 r= 0.00000001。
上面的笔算过程可叙述如下:
1,判断 x 是否小于 y?现在 x <y,故商的整数位商,0”,x 的低位补 0,得余数 r0。
2,比较 r0和 2- 1y,因 r0>2- 1y,表示够减,小数点后第一位商,1”,作 r0- 2- 1y,得余数 r1。
3,比较 r1和 2- 2y,因 r1>2- 2y,表示够减,小数点后第二位商,1”,作 r1- 2- 2y,得余数 r2。
4,比较 r2和 2- 3y,因 r2<2- 3y,不够减,小数点后第三位商,0”,不作减法,得余数 r3(= r2)。
5,比较 r3和 2- 4y,因 r3>2- 4y,表示够减,小数点后第四 2位商,1”,作 r3- 2- 4y,得余数 r4,
共求四位商,至此除法完毕。
在计算机中,小数点是固定的,不能简单地采用手算的办法。为便于机器操作,
使“除数右移”和“右移上商”的操作统一起来。
事实上,机器的运算过程和人毕竟不同,人会心算,一看就知道够不够减。但机器却不会心算,必须先作减法,若余数为正,
才知道够减;若余数为负,才知道不够减。不够减时必须恢复原来的余数,以便再继续往下运算。这种方法称为 恢复余数法 。
要恢复原来的余数,只要当前的余数加上除数即可。但由于要恢复余数,使除法进行过程的步数不固定,因此控制比较复杂。
实际中常用不恢复余数法,又称 加减交替法 。其特点是运算过程中如出现不够减,则不必恢复余数,根据余数符号,可以继续往下运算,因此步数固定,控制简单。
2.不恢复余数的阵列除法器假定所有被处理的数都是正的小数。
不恢复余数的除法也就是加减交替法 。
每一行所执行的操作究竟是加法还是减法,取决于前一行输出的符号与被除数的符号是否一致。当出现不够减时,部分余数相对于被除数来说要改变符号。这时应该产生一个商位,0”,除数首先沿对角线右移,然后加到下一行的部分余数上。当部分余数不改变它的符号时,即产生商位,1”,下一行的操作应该是减法。
例 x = 0.101001,y = 0.111,求 x ÷ y 。
[解,]
[-y ]补 = 1.001
被除数 x 0.1 0 1 0 0 1
减 y 1.0 0 1
余数为负 1.1 1 0 0 0 1 < 0 q0= 0
余数左移 1.1 0 0 0 1
加 y 0.1 1 1
余数为正 0.0 1 1 0 1 > 0 q1= 1
余数左移 0.1 1 0 1
减 y 1.0 0 1
余数为负 1.1 1 1 1 < 0 q2= 0
余数左移 1.1 1 1
加 y 0.1 1 1
余数为正 0.1 1 0 > 0 q3= 1
故得商 q= q0.q1q2q3= 0.101
余数 r= (0.00r3r4r5r6)= 0.000110 演示设有两个浮点数 x 和 y,它们分别为
x = 2Ex ·Mx
y = 2Ey ·My
其中 Ex 和 Ey 分别为数 x 和 y 的阶码,Mx 和 My 为数 x 和 y
的尾数。
两浮点数进行加法和减法的运算规则是
x ± y = (Mx 2Ex - Ey ± My )2Ey,Ex <= Ey
完成浮点加减运算的操作过程大体分为四步:
1,0 操作数的检查;
2,比较阶码大小并完成对阶;
3,尾数进行加或减运算;
4,结果规格化并进行舍入处理。
6,浮点加法、减法运算演示
1) 0 操作数检查浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数 x 或 y 中有一个数为 0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。 0操作数检查步骤则用来完成这一功能。
(2) 比较阶码大小并完成对阶两浮点数进行加减,首先要看两数的阶码是否相同,即小数点位置是否对齐。若二数阶码相同,表示小数点是对齐的,
就可以进行尾数的加减运算。反之,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作 对阶 。要对阶,首先应求出两数阶码 Ex 和 Ey 之差,
即 △ E = Ex - Ey
若△ E= 0,表示两数阶码相等,即 Ex = Ey ;
若△ E>0,表示 Ex > E y ;
若△ E<0,表示 Ex < Ey 。
当 Ex ≠Ey 时,要通过尾数的移动以改变 Ex 或 Ey,使之相等。
原则上,既可以通过 Mx 移位以改变 Ex 来达到 Ex = Ey,也可以通过 My 移位以改变 Ey 来实现 Ex = Ey 。但是,由于浮点表示的数多是规格化的,尾数左移会引起最高有效位的丢失,造成很大误差。 尾数右移虽引起最低有效位的丢失,但造成误差较小。因此,对阶操作规定使尾数右移,尾数右移后阶码作相应增加,其数值保持不变。显然,一个增加后的阶码与另一个阶码相等,增加的阶码的一定是小阶。因此在对阶时,总是使 小阶向大阶看齐,即小阶的尾数向右移位 (相当于小数点左移)每右移一位,其阶码加 1,直到两数的阶码相等为止,右移的位数等于阶差△ E。
(3) 尾数求和运算对阶结束后,即可进行尾数的求和运算。不论加法运算还是减法运算,都按加法进行操作,其方法与定点加减法运算完全一样。
(4) 结果规格化在浮点加减运算时,尾数求和的结果也可以得到
01.ф…ф 或 10.ф…ф,即两符号位不等,这在定点加减法运算中称为溢出,是不允许的。但在浮点运算中,它表明尾数求和结果的绝对值大于 1,向左破坏了规格化。
此时将运算结果右移以实现规格化表示,称为 向右规格化 。规则是:尾数右移 1位,阶码加 1。当尾数不是
1.M时需 向左规格化 。
(5) 舍入处理在对阶或向右规格化时,尾数要向右移位,这样,被右移的尾数的低位部分会被丢掉,从而造成一定误差,因此要进行 舍入处理 。
简单的舍入方法有 两种,一种是 "0舍 1入 "法,即如果右移时被丢掉数位的最高位为 0则舍去,为 1则将尾数的末位加 "1"。另一种是 "恒置一 "法,即只要数位被移掉,
就在尾数的末尾恒置 "1"。
在 IEEE754标准中,舍入处理提供了四种可选方法:
就近舍入 其实质就是通常所说的“四舍五入”。例如,尾数超出规定的
23位的多余位数字 是 10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增 1。若多余的 5位 是 01111,则简单的截尾即可。
对多余的 5位 10000这种特殊情况:若最低有效位现为 0,则截尾;若最低有效位现为 1,则向上进一位使其变为 0。
朝 0舍入 即朝数轴原点方向舍入,就是简单的截尾。无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。这种方法容易导致误差积累。
朝+ ∞舍入 对正数来说,只要多余位不全为 0则向最低有效位进 1;对负数来说则是简单的截尾。
朝- ∞舍入 处理方法正好与 朝+ ∞舍入情况相反。对正数来说,只要多余位不全为 0则 简单截尾 ;对负数来说,向最低有效位进 1。
(6) 浮点数的溢出下图表示了浮点机器数在数轴上的分布情况。
当机器浮点数值大于最大正数 A值,或小于最小负数 B值时,称为 上溢,
这两种情况意味着阶码运算值超出了它所表示的范围,机器必须做中断处理。
当机器浮点数值小于最小正数 a值,或大于最大负数 b值时,称为 下溢 。
下溢不是一个严重问题,通常看作为机器零。
浮点数的溢出是以其阶码溢出表现出来的。在加 \减运算过程中要检查是否产生了溢出:若阶码正常,加 (减 )运算正常结束;若阶码溢出,则要进行相应处理。另外对尾数的溢出也需要处理。
阶码上溢 超过了阶码可能表示的最大值的正指数值,
一般将其认为是+ ∞和- ∞。
阶码下溢 超过了阶码可能表示的最小值的负指数值,
一般将其认为是 0。
尾数上溢 两个同符号尾数相加产生了最高位向上的进位,将尾数右移,阶码增 1来重新对齐。
尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理。
例,设 x = 2010× 0.11011011,y = 2100× (- 0.10101100),
求 x + y 。
为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位,则它们的浮点表示分别为
[x ]浮 = 00,010; 0,11011011
[y ]浮 = 00,100; 1,01010100
<1> 求阶差并对阶 △ E= Ex - Ey = [Ex ]补 + [- Ey ]补 = 00 010+ 11 100= 11 110
即△ E为- 2,x 的阶码小,应使 Mx 右移两位,Ex 加 2,
[x ]浮 = 00,100;0.00110110(11)
其中 (11)表示 Mx 右移 2位后移出的最低两位数 。
<2> 尾数求和
0,0 0 1 1 0 1 1 0 (11)
+ 1,0 1 0 1 0 1 0 0
────────────────
1,1 0 0 0 1 0 1 0 (11)
<3>规格化处理尾数运算结果的符号位与最高数值位同值,应执行左规处理,结果为 1.00010101(10),阶码为 00 011。
<4>舍入处理采用 0舍 1入法处理,则有
1,0 0 0 1 0 1 0 1
+ 1
────────────────
1,0 0 0 1 0 1 1 0
<5>判溢出阶码符号位为 00,不溢出,故得最终结果为
x + y = 2011× (- 0.11101010)
1.浮点乘法、除法运算规则 设有两个浮点数 x 和 y,
x = 2Ex ·Mx
y = 2Ey ·My
浮点乘法运算的规则是,x × y = 2(Ex + Ey )·( Mx × My )
2 浮点乘法、除法运算浮点除法运算的规则是,x ÷ y = 2(Ex - Ey )·( Mx ÷ My )
商的尾数 是相除两数的尾数之商,
商的阶码 是相除两数的阶码之差。
也有规格化和舍入等步骤。
乘积的尾数 是相乘两数的尾数之积,
乘积的阶码 是相乘两数的阶码之和。
当然,这里也有规格化与舍入等步骤。
3.浮点乘、除法运算步骤浮点数的乘除运算大体分为四步:
第一步,0 操作数检查;
第二步,阶码加 /减操作;
第三步,尾数乘 /除操作;
第四步,结果规格化及舍入处理。
(1) 浮点数的阶码运算对阶码的运算有+ 1、- 1、两阶码求和、
两阶码求差四种,运算时还必须检查结果是否溢出。
在计算机中,阶码通常用补码或移码形式表示。
补码运算规则和判定溢出的方法,前面已经讲过。
这里只对移码的运算规则和判定溢出的方法进行讲解。
移码的定义为 [x ]移 = 2n+ x 2n> x ≥- 2n
按此定义,则有 [x ]移 + [y ]移 = 2n+ x + 2n+ y
= 2n+ (2n+ (x + y ))
= 2n+ [x + y ]移即直接用移码实现求阶码之和时,结果的最高位多加了个 1,要得到正确的移码形式结果,必须对结果的符号再执行一次求反。
当混合使用移码和补码时,考虑到移码和补码的关系:对同一个数值,其数值位完全相同,而符号位正好完全相反。
而 [y ]补 的定义为 [y ]补 = 2n+ 1+ y
则求阶码和用如下方式完成,[x ]移 + [y ]补 = 2n+ x + 2n+ 1+ y
= 2n+ 1+ (2n+ (x + y ))
即 [x + y ]移 = [x ]移 + [y ]补 (mod 2n+ 1)
同理 [x - y ]移 = [x ]移 + [- y ]补上二式表明执行阶码加减时,对加数或减数 y 来说,应送移码符号位正常值的反码。
如果阶码运算的结果溢出,上述条件则不成立。此时,使用双符号位的阶码加法器,并规定移码的第二个符号位,即最高符号位恒用 0 参加加减运算,
则溢出条件是结果的最高符号位为 1。
此时,当低位符号位为 0时,表明结果上溢,为 1时,表明结果下溢。当最高符号位为 0时,表明没有溢出;低位符号位为 1,表明结果为正;为 0 时,表明结果为负。
(2) 尾数处理浮点加减法对结果的规格化及舍入处理也适用于浮点乘除法。
第一种简单方法是,无条件地丢掉正常尾数最低位之后的全部数值。
这种办法被称为截断处理,好处是处理简单,缺点是影响结果的精度。
第二种简单办法是,运算过程中保留右移中移出的若干高位的值,最后再按某种规则用这些位上的值修正尾数。这种处理方法被称为舍入处理。
当尾数用原码表示时,舍入规则比较简单。
最简便的方法,是只要尾数的最低位为 1,或移出的几位中有为 1的数值位,
就是最低位的值为 1。
另一种是 0舍 1入法,即当丢失的最高位的值为 1时,把这个 1加到最低数值位上进行修正,否则舍去丢失的的各位的值。
这样处理时,舍入效果对正数负数相同,入将使数的绝对值变大,舍则使数的绝对值变小。
当尾数是用补码表示时,所用的舍入规则,应该与用原码表示时产生相同的处理效果。
具体规则是:
当丢失的各位均为 0时,不必舍入;
当丢失的最高位为 0 时,以下各位不全为 0 时,或者丢失的最高位为 1,以下各位均为 0时,则舍去丢失位上的值;
当丢失的最高位为 1,以下各位不全为 0 时,则执行在尾数最低位入 1的修正操作。
§ 1 各种进位制及其转换
1、二进制、八进制、十六进制之间的转换
2、十进制向其它进制的转换
§ 2 真值、机器码、原码、反码、补码、移码?
真值:一个数本身。 例如,+1100
机器码:正负号也用 0,1表示的真值原码:机器码反码:对正数来说,其反码和原码的形式相同对负数来说,反码为其原码的数值部分的各位取反补码:对正数来说,其补码和原码的形式相同对负数来说,补码为其原码的数值部分的各位取反后(反码),在未位加 1。
移码:在补码的最高位加 1。
补码和移码的数值部分相同,而符号位相反,
小结,上面的数据四种机器表示法中,移码表示法主要用于表示浮点数的阶码。由于补码表示对加减法运算十分方便,因此目前机器中广泛采用补码表示法。在这类机器中,数用补码表示,补码存储,补码运算。也有些机器,数用原码进行存储和传送,运算时改用补码。还有些机器在做加减法时用补码运算,在做乘除法时用原码运算。
§ 3,数据格式计算机中常用的数据表示格式有两种,
一是 定点格式,二是 浮点格式。
一般来说,定点格式容许的数值范围 有限,
但要求的处理硬件比较 简单 。
浮点格式容许的数值范围 很大,但要求的处理硬件比较 复杂 。
3.1,定点数的表示方法定点表示,约定机器中所有数据的小数点位置是固定不变的。
由于约定在 固定 的位置,小数点就不再使用记号,.”来表示。
通常将数据表示成 纯小数 或 纯整数 。
定点数 x=x 0 x 1 x 2 … x n 在定点机中表示如下 (x 0:符号位,0代表正号,1代表负号 ):
纯小数 的表示范围为 (x 0 x 1 x 2 … x n 各位均为 0时最小;各位均为 1时最大 )
0≤|x |≤1- 2- n (3.1)
纯整数 的表示范围为
0≤|x |≤2n- 1 (3.2)
目前计算机中多采用定点纯整数表示,因此将定点数表示的运算简称为 整数运算 。
3.2,浮点数的表示方法,电子的质量 (9× 10- 28克 )和太阳的质量 (2× 1033克 )相差甚远,在定点计算机中无法直接来表示这个数值范围,要使它们送入定点计算机进行某种运算,必须对它们分别取不同的比例因子,
使其数值部分绝对值小于 1,即:
9 × 10- 28= 0.9 × 10- 27
2 × 1033= 0.2 × 1034
这里的比例因子 10- 27 和 1034要分别存放在机器的某个存储单元中,以便以后对计算结果按这个比例增大。显然这要占用一定的存储空间和运算时间。
浮点表示法,把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示,这种把数的范围和精度分别表示的方法,数的小数点位置随比例因子的不同而在一定范围内自由浮动。
任意一个十进制数 N 可以写成
N = 10E.M (3.3)
同样,在计算机中一个任意进制数 N 可以写成
N=R e.m (3.4)
N=R e.m (3.4)
m,尾数,是一个纯小数。
e,比例因子的指数,称为浮点的 指数,是一个整数。
R,比例因子的 基数,对于二进计数值的机器是一个常数,
一般规定 R 为 2,8或 16。
一个机器浮点数由 阶码 和 尾数 及其 符号位 组成,
尾数,用定点小数表示,给出有效数字的位数决定了浮点数的表示精度;
阶码,用整数形式表示,指明 小数点 在数据中的位置,决定了浮点数的表示范围。):
为便于软件移植,按照 IEEE754 的标准,
32位浮点数的标准格式为,
32位的浮点数中,
S,浮点数的符号位,1 位,0表示正数,1表示负数。 M,
尾数,23位,用小数表示,小数点放在尾数域的最前面。
E,阶码,8 位阶符采用隐含方式,即采用移码方式来表示正负指数。
移码方法对两个指数大小的比较和对阶操作都比较方便,因为阶码域值大者其指数值也大。
[例 1]浮点数 x 的二进制存储格式为 (41360000)16
按照 IEEE754 的标准,64位浮点数的标准格式为,
64位的浮点数中,
S,浮点数的符号位,1 位,0表示正数,1表示负数。
M,尾数,52位,用小数表示,小数点放在尾数域的最前面。
E,阶码,11位阶符采用隐含方式,即采用移码方式来表示正负指数。
3.3 补码加减法
1.原码除法运算原理两个原码表示的数相除时,商的符号由两数的符号按位相加求得,
商的数值部分由两数的数值部分相除求得。
5.除法下面仅讨论数值部分的运算。设被除数 x = 0.1001,除数 y = 0.1011,模仿十进制除法运算,
以手算方法求 x ÷ y 的过程如下,
0.1 1 0 1 商 q
0.1 0 1 1 0.1 0 0 1 0 x (r0) 被除数小于除数,商 0
- 0.0 1 0 1 1 2- 1y 除数右移 1位,减除数,商 1
0.0 0 1 1 1 0 r1 得余数 r1
- 0.0 0 1 0 1 1 2- 2y 除数右移 1位,减除数,商 1
0.0 0 0 0 1 1 0 r2 得余数 r2
- 0.0 0 0 1 0 1 1 2- 3y 除数右移 1位,不减除数,商 0
0.0 0 0 0 1 1 0 0 r3 得余数 r3
- 0.0 0 0 0 1 0 1 1 2- 4y 除数右移 1位,减除数,商 1
- 0.0 0 0 0 0 0 0 1 r4 得余数 r4
得 x ÷ y 的商 q= 0.1101,余数为 r= 0.00000001。
上面的笔算过程可叙述如下:
1,判断 x 是否小于 y?现在 x <y,故商的整数位商,0”,x 的低位补 0,得余数 r0。
2,比较 r0和 2- 1y,因 r0>2- 1y,表示够减,小数点后第一位商,1”,作 r0- 2- 1y,得余数 r1。
3,比较 r1和 2- 2y,因 r1>2- 2y,表示够减,小数点后第二位商,1”,作 r1- 2- 2y,得余数 r2。
4,比较 r2和 2- 3y,因 r2<2- 3y,不够减,小数点后第三位商,0”,不作减法,得余数 r3(= r2)。
5,比较 r3和 2- 4y,因 r3>2- 4y,表示够减,小数点后第四 2位商,1”,作 r3- 2- 4y,得余数 r4,
共求四位商,至此除法完毕。
在计算机中,小数点是固定的,不能简单地采用手算的办法。为便于机器操作,
使“除数右移”和“右移上商”的操作统一起来。
事实上,机器的运算过程和人毕竟不同,人会心算,一看就知道够不够减。但机器却不会心算,必须先作减法,若余数为正,
才知道够减;若余数为负,才知道不够减。不够减时必须恢复原来的余数,以便再继续往下运算。这种方法称为 恢复余数法 。
要恢复原来的余数,只要当前的余数加上除数即可。但由于要恢复余数,使除法进行过程的步数不固定,因此控制比较复杂。
实际中常用不恢复余数法,又称 加减交替法 。其特点是运算过程中如出现不够减,则不必恢复余数,根据余数符号,可以继续往下运算,因此步数固定,控制简单。
2.不恢复余数的阵列除法器假定所有被处理的数都是正的小数。
不恢复余数的除法也就是加减交替法 。
每一行所执行的操作究竟是加法还是减法,取决于前一行输出的符号与被除数的符号是否一致。当出现不够减时,部分余数相对于被除数来说要改变符号。这时应该产生一个商位,0”,除数首先沿对角线右移,然后加到下一行的部分余数上。当部分余数不改变它的符号时,即产生商位,1”,下一行的操作应该是减法。
例 x = 0.101001,y = 0.111,求 x ÷ y 。
[解,]
[-y ]补 = 1.001
被除数 x 0.1 0 1 0 0 1
减 y 1.0 0 1
余数为负 1.1 1 0 0 0 1 < 0 q0= 0
余数左移 1.1 0 0 0 1
加 y 0.1 1 1
余数为正 0.0 1 1 0 1 > 0 q1= 1
余数左移 0.1 1 0 1
减 y 1.0 0 1
余数为负 1.1 1 1 1 < 0 q2= 0
余数左移 1.1 1 1
加 y 0.1 1 1
余数为正 0.1 1 0 > 0 q3= 1
故得商 q= q0.q1q2q3= 0.101
余数 r= (0.00r3r4r5r6)= 0.000110 演示设有两个浮点数 x 和 y,它们分别为
x = 2Ex ·Mx
y = 2Ey ·My
其中 Ex 和 Ey 分别为数 x 和 y 的阶码,Mx 和 My 为数 x 和 y
的尾数。
两浮点数进行加法和减法的运算规则是
x ± y = (Mx 2Ex - Ey ± My )2Ey,Ex <= Ey
完成浮点加减运算的操作过程大体分为四步:
1,0 操作数的检查;
2,比较阶码大小并完成对阶;
3,尾数进行加或减运算;
4,结果规格化并进行舍入处理。
6,浮点加法、减法运算演示
1) 0 操作数检查浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数 x 或 y 中有一个数为 0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。 0操作数检查步骤则用来完成这一功能。
(2) 比较阶码大小并完成对阶两浮点数进行加减,首先要看两数的阶码是否相同,即小数点位置是否对齐。若二数阶码相同,表示小数点是对齐的,
就可以进行尾数的加减运算。反之,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作 对阶 。要对阶,首先应求出两数阶码 Ex 和 Ey 之差,
即 △ E = Ex - Ey
若△ E= 0,表示两数阶码相等,即 Ex = Ey ;
若△ E>0,表示 Ex > E y ;
若△ E<0,表示 Ex < Ey 。
当 Ex ≠Ey 时,要通过尾数的移动以改变 Ex 或 Ey,使之相等。
原则上,既可以通过 Mx 移位以改变 Ex 来达到 Ex = Ey,也可以通过 My 移位以改变 Ey 来实现 Ex = Ey 。但是,由于浮点表示的数多是规格化的,尾数左移会引起最高有效位的丢失,造成很大误差。 尾数右移虽引起最低有效位的丢失,但造成误差较小。因此,对阶操作规定使尾数右移,尾数右移后阶码作相应增加,其数值保持不变。显然,一个增加后的阶码与另一个阶码相等,增加的阶码的一定是小阶。因此在对阶时,总是使 小阶向大阶看齐,即小阶的尾数向右移位 (相当于小数点左移)每右移一位,其阶码加 1,直到两数的阶码相等为止,右移的位数等于阶差△ E。
(3) 尾数求和运算对阶结束后,即可进行尾数的求和运算。不论加法运算还是减法运算,都按加法进行操作,其方法与定点加减法运算完全一样。
(4) 结果规格化在浮点加减运算时,尾数求和的结果也可以得到
01.ф…ф 或 10.ф…ф,即两符号位不等,这在定点加减法运算中称为溢出,是不允许的。但在浮点运算中,它表明尾数求和结果的绝对值大于 1,向左破坏了规格化。
此时将运算结果右移以实现规格化表示,称为 向右规格化 。规则是:尾数右移 1位,阶码加 1。当尾数不是
1.M时需 向左规格化 。
(5) 舍入处理在对阶或向右规格化时,尾数要向右移位,这样,被右移的尾数的低位部分会被丢掉,从而造成一定误差,因此要进行 舍入处理 。
简单的舍入方法有 两种,一种是 "0舍 1入 "法,即如果右移时被丢掉数位的最高位为 0则舍去,为 1则将尾数的末位加 "1"。另一种是 "恒置一 "法,即只要数位被移掉,
就在尾数的末尾恒置 "1"。
在 IEEE754标准中,舍入处理提供了四种可选方法:
就近舍入 其实质就是通常所说的“四舍五入”。例如,尾数超出规定的
23位的多余位数字 是 10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增 1。若多余的 5位 是 01111,则简单的截尾即可。
对多余的 5位 10000这种特殊情况:若最低有效位现为 0,则截尾;若最低有效位现为 1,则向上进一位使其变为 0。
朝 0舍入 即朝数轴原点方向舍入,就是简单的截尾。无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。这种方法容易导致误差积累。
朝+ ∞舍入 对正数来说,只要多余位不全为 0则向最低有效位进 1;对负数来说则是简单的截尾。
朝- ∞舍入 处理方法正好与 朝+ ∞舍入情况相反。对正数来说,只要多余位不全为 0则 简单截尾 ;对负数来说,向最低有效位进 1。
(6) 浮点数的溢出下图表示了浮点机器数在数轴上的分布情况。
当机器浮点数值大于最大正数 A值,或小于最小负数 B值时,称为 上溢,
这两种情况意味着阶码运算值超出了它所表示的范围,机器必须做中断处理。
当机器浮点数值小于最小正数 a值,或大于最大负数 b值时,称为 下溢 。
下溢不是一个严重问题,通常看作为机器零。
浮点数的溢出是以其阶码溢出表现出来的。在加 \减运算过程中要检查是否产生了溢出:若阶码正常,加 (减 )运算正常结束;若阶码溢出,则要进行相应处理。另外对尾数的溢出也需要处理。
阶码上溢 超过了阶码可能表示的最大值的正指数值,
一般将其认为是+ ∞和- ∞。
阶码下溢 超过了阶码可能表示的最小值的负指数值,
一般将其认为是 0。
尾数上溢 两个同符号尾数相加产生了最高位向上的进位,将尾数右移,阶码增 1来重新对齐。
尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理。
例,设 x = 2010× 0.11011011,y = 2100× (- 0.10101100),
求 x + y 。
为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位,则它们的浮点表示分别为
[x ]浮 = 00,010; 0,11011011
[y ]浮 = 00,100; 1,01010100
<1> 求阶差并对阶 △ E= Ex - Ey = [Ex ]补 + [- Ey ]补 = 00 010+ 11 100= 11 110
即△ E为- 2,x 的阶码小,应使 Mx 右移两位,Ex 加 2,
[x ]浮 = 00,100;0.00110110(11)
其中 (11)表示 Mx 右移 2位后移出的最低两位数 。
<2> 尾数求和
0,0 0 1 1 0 1 1 0 (11)
+ 1,0 1 0 1 0 1 0 0
────────────────
1,1 0 0 0 1 0 1 0 (11)
<3>规格化处理尾数运算结果的符号位与最高数值位同值,应执行左规处理,结果为 1.00010101(10),阶码为 00 011。
<4>舍入处理采用 0舍 1入法处理,则有
1,0 0 0 1 0 1 0 1
+ 1
────────────────
1,0 0 0 1 0 1 1 0
<5>判溢出阶码符号位为 00,不溢出,故得最终结果为
x + y = 2011× (- 0.11101010)
1.浮点乘法、除法运算规则 设有两个浮点数 x 和 y,
x = 2Ex ·Mx
y = 2Ey ·My
浮点乘法运算的规则是,x × y = 2(Ex + Ey )·( Mx × My )
2 浮点乘法、除法运算浮点除法运算的规则是,x ÷ y = 2(Ex - Ey )·( Mx ÷ My )
商的尾数 是相除两数的尾数之商,
商的阶码 是相除两数的阶码之差。
也有规格化和舍入等步骤。
乘积的尾数 是相乘两数的尾数之积,
乘积的阶码 是相乘两数的阶码之和。
当然,这里也有规格化与舍入等步骤。
3.浮点乘、除法运算步骤浮点数的乘除运算大体分为四步:
第一步,0 操作数检查;
第二步,阶码加 /减操作;
第三步,尾数乘 /除操作;
第四步,结果规格化及舍入处理。
(1) 浮点数的阶码运算对阶码的运算有+ 1、- 1、两阶码求和、
两阶码求差四种,运算时还必须检查结果是否溢出。
在计算机中,阶码通常用补码或移码形式表示。
补码运算规则和判定溢出的方法,前面已经讲过。
这里只对移码的运算规则和判定溢出的方法进行讲解。
移码的定义为 [x ]移 = 2n+ x 2n> x ≥- 2n
按此定义,则有 [x ]移 + [y ]移 = 2n+ x + 2n+ y
= 2n+ (2n+ (x + y ))
= 2n+ [x + y ]移即直接用移码实现求阶码之和时,结果的最高位多加了个 1,要得到正确的移码形式结果,必须对结果的符号再执行一次求反。
当混合使用移码和补码时,考虑到移码和补码的关系:对同一个数值,其数值位完全相同,而符号位正好完全相反。
而 [y ]补 的定义为 [y ]补 = 2n+ 1+ y
则求阶码和用如下方式完成,[x ]移 + [y ]补 = 2n+ x + 2n+ 1+ y
= 2n+ 1+ (2n+ (x + y ))
即 [x + y ]移 = [x ]移 + [y ]补 (mod 2n+ 1)
同理 [x - y ]移 = [x ]移 + [- y ]补上二式表明执行阶码加减时,对加数或减数 y 来说,应送移码符号位正常值的反码。
如果阶码运算的结果溢出,上述条件则不成立。此时,使用双符号位的阶码加法器,并规定移码的第二个符号位,即最高符号位恒用 0 参加加减运算,
则溢出条件是结果的最高符号位为 1。
此时,当低位符号位为 0时,表明结果上溢,为 1时,表明结果下溢。当最高符号位为 0时,表明没有溢出;低位符号位为 1,表明结果为正;为 0 时,表明结果为负。
(2) 尾数处理浮点加减法对结果的规格化及舍入处理也适用于浮点乘除法。
第一种简单方法是,无条件地丢掉正常尾数最低位之后的全部数值。
这种办法被称为截断处理,好处是处理简单,缺点是影响结果的精度。
第二种简单办法是,运算过程中保留右移中移出的若干高位的值,最后再按某种规则用这些位上的值修正尾数。这种处理方法被称为舍入处理。
当尾数用原码表示时,舍入规则比较简单。
最简便的方法,是只要尾数的最低位为 1,或移出的几位中有为 1的数值位,
就是最低位的值为 1。
另一种是 0舍 1入法,即当丢失的最高位的值为 1时,把这个 1加到最低数值位上进行修正,否则舍去丢失的的各位的值。
这样处理时,舍入效果对正数负数相同,入将使数的绝对值变大,舍则使数的绝对值变小。
当尾数是用补码表示时,所用的舍入规则,应该与用原码表示时产生相同的处理效果。
具体规则是:
当丢失的各位均为 0时,不必舍入;
当丢失的最高位为 0 时,以下各位不全为 0 时,或者丢失的最高位为 1,以下各位均为 0时,则舍去丢失位上的值;
当丢失的最高位为 1,以下各位不全为 0 时,则执行在尾数最低位入 1的修正操作。