定点数浮点数的运算

it2026-01-08  7

定点数运算

1.定点数补码的加法

1.定义:

两个补码表示的数相加,符号位参加运算,且两数和的补码等于两数补码之和。两个数不管正负,均用补码表示,符号位应当做数值参加运算,符号位相加所产生的进位要丢掉,结果为补码。

2.举例:
X=0.1011 Y=-0.0101,求 X+Y=? 1 解: [X]补=0.1011,[Y]补=1.1011 [X]补+[Y]补 = 0.1011+1.1011 = 0.0110 = [X+Y]补 所以 X+Y = 0.0110

2.定点数的补码减法

1.定义:

对于减法,(-Y)的补码称为[Y]补的机器负数,由[Y]补求[-Y]补的过程称为将[Y]补“变补”或对[Y]补求补,由[Y]补求[-Y]补的方法是,不管Y的真值为正或为负,都是将[Y]补的各位连同符号位在内全变反后,最低位加1。

2.说明:

将“某数的补码表示”与“变补”这两个概念区分开来。一个负数由原码表示转换成补码表示时,符号位是不变的,仅对数值位各位变反,末位加“1”。而变补则不论这个数的真值是正是负,一律连同符号位一起变反(所有的二进制位一起变反),末位加“1”。

3.举例

X=-0.1011,Y=-0.0110, 求X-Y=?

解: [X]补=1.0101,[Y]补=1.1010,[-Y]补=0.0110 [X]补+[-Y]补 = 1.1011 = [X-Y]补 所以 X-Y = 1.0101 = -0.0101

3.原码一位乘法

1.定义

原码一位乘法是从手算演变而来的。即用两个操作数的绝对值相乘,乘积的符号为两操作数符号的异或值(同号为正,异号为负)。

定点原码一位乘法(Unsigned Binary Multiplication)

设被乘数 [ X ] 原 = X f X 1 X 2 . . . X n − 1 X n [X]_原=X_fX_1X_2...X_{n-1}X_n [X]=XfX1X2...Xn1Xn

乘数 [ Y ] 原 = Y f Y 1 Y 2 . . . Y n − 1 Y n [Y]_原=Y_fY_1Y_2...Y_{n-1}Y_n [Y]=YfY1Y2...Yn1Yn

乘积 [ Z ] 原 = Z f Z 1 Z 2 . . . Z 2 n − 1 Z 2 n [Z]_原=Z_fZ_1Z_2...Z{2n-1}Z_{2n} [Z]=ZfZ1Z2...Z2n1Z2n

2.运算规则:

由于机器字长通常仅有 n 位,两个 n 位数相乘结果为 2n 位;且仅仅有两个操作数相加的加法器,难以胜任将 n 个位积一次相加起来。因此,在计算机中不能直接照搬手工计算乘法的方法,必须进行修改使其便于计算机实现。

被乘数和乘数均取绝对值参加运算,符号位单独考虑;被乘数取双符号位,部分积的长度同被乘数,初值为0;从乘数的最低位 Y n Y_n Yn 开始判断: 若 Y n = 1 Y_n=1 Yn1,则部分积加上被乘数|X|,然后右移一位; 若 Y n = 0 Y_n=0 Yn0,则部分积加上0,然后右移一位。重复第3步操作n次
3.例题

已知X=0.1101,Y=-0.1011,用原码一位乘计算X * Y=?

解: [X]原=0.1101,[Y]原=1.1011 |X|=00.1101(用双符号位表示),|Y|=0.1011(用单符号位) ,部分积初值:00.0000 - 乘数最低位为 1,所以00.0000(部分积)+00.1101(被乘数) = 00.1101;再向右移一位:00.01101 - 乘数往前数一位为 1 ,00.01101 + 00.1101 = 01.00111;再向右移一位:00.100111 - 乘数往前数一位为 0;不需要加上被乘数了,只需右移一位:00.0100111 - 乘数往前数一位为 1,00.0100111 + 00.1101 = 01.0001111,右移一位:00.10001111 - 符号可按异或运算得到(同号相乘为正,异号相乘为负),这里是异号,所以符号位是 1 - 因此[X*Y]原 = 1.10001111;X*Y = -0.10001111

总共需要 n 次加法和 n 次移位


4.补码一位乘法

1.运算规则:
符号位参加运算,运算的数均以补码表示;被乘数一般取双符号位参加运算;乘数可取单符号位;乘数末位增设附加位 Y n + 1 Y_n+1 Yn+1,且初值为0。从低位到高位,依次判断相邻的两位乘数的状态,根据比较结果按下表操作。最后一步不移位,仅根据 Y 0 Y_0 Y0 Y 1 Y_1 Y1 的比较结果作相应的运算 Y n Y_n Yn (高位) Y n + 1 Y_{n+1} Yn+1 (低位)操作00部分积右移一位01部分积加 [ X ] 补 [X]_补 [X], 右移一位10部分积加 [ − X ] 补 [-X]_补 [X], 右移一位11部分积右移一位
2.例题:

已知 X=-0.1101,Y=0.1011, 用补码一位乘计算X * Y=?

[X]=11.0011[-X]=00.1101(用双符号表示)[Y]=0.10110(用单符号位), 部分积:00.0000 1. 0.10110(乘数)上 Y4Y5 位上的是 1 0,所以部分积加[-X]补,再右移一位:00.01101 2. 0.10110(乘数)上 Y3Y4 位上的是 1 1,所以部分积右移一位:00.001101 3. 0.10110(乘数)上 Y2Y3 位上的是 0 1,所以部分积加[X]补,再右移一位:11.1011001 4. 0.10110(乘数)上 Y1Y2 位上的是 1 0,所以部分积加[-X]补,再右移一位:00.01000001 5. 0.10110(乘数)上 Y0Y1 位上的是 0 1,所以部分积加[X]补,最后一步不移位:11.01110001 6. 所以[X*Y]= 1.01110001,X*Y = -0.10001111

总共需要 n + 1 次加法和 n 次移位


5.原码一位除法

5.1.恢复余数法

1.运算规则

符号位与数值位分开求,商符由两个数的符号位“异或”形成 X s ⨁ Y s X_s \bigoplus Y_s XsYs

每次商 1,观察余数为正还是为负,为负,商 0,加除数 [ ∣ y ∣ ] 补 [|y|]_补 [y] 恢复余数,

计算余数相当于 [ ∣ x ∣ − ∣ y ∣ ] 补 = [ ∣ x ∣ ] 补 + [ − ∣ y ∣ ] 补 [|x|-|y|]_补=[|x|]_补+[-|y|]_补 [xy]=[x]+[y]

然后余数左移一位

2.例题:

已知X=0.1001,Y=0.1101,计算 X / Y = ?

解: [|X|]原 = 0.1001,[|Y|]原 = 0.1101,[-|Y|]补 = 1.0011 设每次的余数位Rn,商数位Q。 1.作X-Y:[|X|]原 + [-|Y|]补 = 1.1110,余数R0为负数,所以上商为0,加[|Y|]补恢复余数,R0=1.1110+0.1101=0.1011, R0左移一位,最终R0 = 1.0110,Q = 0。 2.R0 + [-|Y|]补 = 0.1001,余数为正,上商为1,余数左移一位,最终R1 = 1.0010,Q = 0.1 3.R1 + [-|Y|]补 = 0.0101,余数为正,上商为1, ......

左移 n 次,上商 n + 1 次,最后一次上商不左移。

我们注意到,恢复余数求下一个余数的过程其实就是 (R + Y)*2 - Y = 2R + Y,那么就可以跳过恢复余数的过程,让余数左移一位再加上除数就可以了。

5.2.加减交替法

计算原码一位除法推荐使用不恢复余数法(加减交替法)

1.运算规则:

首先作 X-Y,余数为正,表明产生溢出,应终止除法运算;余数为负,上商为0(作为商的符号位),然后重复下述操作n次,可得商的n位数值。

余数左移一位。余数为正时,减除数;余数为负时,加除数。所得的新余数为正时,上商为1;为负时,上商为0。由于运算中余数共左移了n次,相当于乘 2 n 2^n 2n, 故最后得余数应乘上 2 − n 2^{-n} 2n才是真正的正确余数。
2.例题:

已知X=0.1001,Y=0.1011,计算 X / Y = ?

解: [|X|]原 = 00.1001,[|Y|]原 = 00.1011,[-|Y|]补 = 11.0101 设每次的余数位Rn,商数位Q。 1.作X-Y:[|X|]原 + [-|Y|]补 = 11.1110,余数R0为负数,所以上商为0,R0左移一位,最终R0 = 11.1100,Q = 0。 2.因为R0为负数,所以余数R0要加上除数Y: R0 + [|Y|]原 = 00.0111,余数为正,上商为1,余数左移一位,最终R1 = 00.1110,Q = 0.1 3.因为R1为正数,所以余数R1要减去除数Y: R1 + [-|Y|]原 = 00.0011,余数为正,上商为1,余数左移一位,最终R2 = 00.0110,Q = 0.11 4.因为R2为正数,所以余数R2要减去除数Y: R2 + [-|Y|]原 = 11.1011,余数为负,上商为0,余数左移一位,最终R3 = 11.0110,Q = 0.110 5.因为R3为负数,所以余数R3要加上除数Y: R3 + [|Y|]原 = 00.0001,余数为正,上商为1,最后一步余数不变,最终R4 = 00.0001,Q = 0.1101 6.所以最后商为 Q = 0.1101,余数 R = 00.0001*2^(-4)

恢复余数法

当余数为负时商 0,并 + |除数|,再左移,再 - |除数|

加减交替法

当余数为负时商 0,并左移,再 + |除数|

6.补码一位除法

1.运算规则:
参加运算的数用补码表示。符号位参加运算,结果为补码。被除数与除数同号,做被除数减除数的运算,被除数与除数异号, 做被除数加除数的运算。如果余数与除数同号, 商1,左移一位, 减除数,如果余数与除数异号, 商0, 左移一位, 加除数。重复上步n次,末位恒置1。
2.例题:

已知X=0.1000, Y=-0.1010,用补码一位除计算X ÷Y=?

解: [X]= 00.1000[Y]= 11.0110[-Y]= 00.1010 1.[X][Y]补异号,所以被除数加除数:[X]+ [Y]= 11.11102.余数和除数同号,所以商1,余数再左移一位 = 11.1100,再减除数 = 00.0110 3.新的余数和除数异号,所以商现在是1.0,余数再左移一位 = 00.1100,再加除数 = 00.0010 4.新的余数和除数异号,所以商现在是1.00,余数再左移一位 = 00.0100,再加除数 = 11.1010 5.新的余数和除数同号,所以商现在是1.001,余数再左移一位 = 11.0100,再减除数 = 11.1110 6.末位恒置1,此时商为:1.0011 7.最终:[]= 1.0011,所以商 = -0.1101 除法类型符号位参与运算加减次数移位上商、加减原则说明原码加减交替法否N+1或N+2左移 N 次余数的正负若最终余数为负,需恢复余数补码加减交替法是N+1左移 N 次余数和除数是否同号商末位恒置1

浮点数运算

浮点数表示为 N = r E × M N=r^E×M N=rE×M

阶码 E 反应浮点数的表示范围及小数点的实际位置

尾数 M 的数值部分的位数 n 反映浮点数的精度

规格化浮点数

规格化浮点数的尾数 M 应满足 1 / r ≤ ∣ M ∣ ≤ 1 1/r ≤ |M| ≤ 1 1/rM1

原码规格化

正数为 0.1****** 的形式,其最大值表示为 0.11…1,最小值表示为 0.10…0

尾数的表示范围为 1 / 2 ≤ M ≤ ( 1 − 2 − n ) 1/2 ≤ M ≤ (1- 2^{-n}) 1/2M(12n)

负数为 1.1****** 的形式,其最大值表示为 1.10…0,最小值表示为 1.11…1

尾数的表示范围位 − ( 1 − 2 − n ) ≤ M ≤ − 1 / 2 -(1- 2^{-n}) ≤ M ≤ -1/2 (12n)M1/2

补码规格化

正数为 0.1****** 的形式,其最大值表示为 0.11…1,最小值表示为 0.10…0

尾数的表示范围为 1 / 2 ≤ M ≤ ( 1 − 2 − n ) 1/2 ≤ M ≤ (1- 2^{-n}) 1/2M(12n)

负数为 1.0****** 的形式,其最大值表示为 1.01…1,最小值表示为 1.00…0

尾数的表示范围为 − 1 ≤ M ≤ − ( 1 / 2 + 2 − n ) -1 ≤ M ≤ -(1/2+2^{-n}) 1M(1/2+2n)

浮点数加减运算

对阶

小阶向大阶对齐

尾数加减

规格化

舍入

“0” 舍 “1” 入法恒置 “1” 法

判溢出

最新回复(0)