文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>2.6.1 浮点加法、减法运算

2.6.1 浮点加法、减法运算

时间:2010-09-22  来源:yuxinlen

2.6.1 浮点加法、减法运算

设有两个浮点数x和y,它们分别为

x=2Ex·Mx

y=2Ey·My
  
其中Ex和Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。

两浮点数进行加法和减法的运算规则是

z =x±y=(Mx2Ex-Ey±My)2Ey,  Ex<=Ey    (2.39)

完成浮点加减运算的操作过程大体分为四步:

  1. 0操作数的检查;
2. 比较阶码大小并完成对阶;
3. 尾数进行加或减运算;
4. 结果规格化并进行舍入处理。

浮点加减运算的操作流程:

(1) 0 操作数检查

浮点加减运算过程比定点运算过程复杂。如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。0操作数检查步骤则用来完成这一功能。

(2) 比较阶码大小并完成对阶

两浮点数进行加减,首先要看两数的阶码是否相同,即小数点位置是否对齐。若二数阶码相同,表示小数点是对齐的,就可以进行尾数的加减运算。反之,若二数 阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。要对阶,首先应求出两数阶码Ex和Ey之差,即

△E = Ex-Ey

若△E=0,表示两数阶码相等,即Ex=Ey;若△E<0,表示Ex<Ey;若△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来重新对齐。

尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理。

[例25] 设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)

相关阅读 更多 +
排行榜 更多 +
猎枪行动

猎枪行动

飞行射击 下载
导弹袭击

导弹袭击

飞行射击 下载
猫猫突围封锁要塞新手打法

猫猫突围封锁要塞新手打法

飞行射击 下载