【浮点数怎么计算?】
浮点数怎么计算?
【浮点数怎么计算?】
浮点数怎么计算?
请耐心看完:
浮点数运算
假定有两个浮点数X=Mx*2Ex,Y=My*2Ey
(1)加减运算
实现X±Y运算,需要如下五步:
1.1对阶操作,即比较两个浮点数的阶码值的大小.求△E=Ex-Ey.当其不等于零时,首先应使两个数取相同的阶码值.其实现方法是,将原来阶码小的数的尾数右移|△E|位,其阶码值加上|△E|,即每右移一次尾数要使阶码加1,则该浮点数的值不变(但精度变差了).尾数右移时,对原码形式的尾数,符号位不参加移位,尾数高位补0;对补码形式的尾数,符号位要参加右移并使自己保持不变.为减少误差,可用另外的线路,保留右移过程中丢掉的一到几位的高位值,供以后舍入操作使用.
1.2实现尾数的加(减)运算,对两个完成对阶后的浮点数执行求和(差)操作.
1.3规格化处理,若得到的结果不满足规格化规则,就必须把它变成规格化的数,规格化处理规则如下:
x09当结果尾数的两个符号位的值不同时,表明尾数运算结果溢出.此时应使结果尾数右移一位,并使阶码的值加1,这被称为向右规格化,简称右规.
x09当尾数的运算结果不溢出,但最高数值位与符号位同值,表明不满足规格化规则,此时应重复地使尾数左移、阶减减1,直到出现在最高数值位上的值与符号位的值不同为止,这是向左规格化的操作,简称左规.
1.4舍入操作.在执行对阶或右规操作时,会使尾数低位上的一位或多位的数值被移掉,使数值的精度受到影响,可以把移掉的几个高位的值保存起来供舍入使用.舍入的总的原则是要有舍有入,而且尽量使舍和入的机会均等,以防止误差积累.常用的办法有"0"舍"1"入法,即移掉的最高位为1时则在尾数末位加1;为0时则舍去移掉的数值.该方案的最大误差为2-(n+1).这样做可能又使尾数溢出,此时就要再做一次右规.另一种方法"置1"法,即右移时,丢掉移出的原低位上的值,并把结果的最低位置成1.该方案同样有使结果尾数变大或变小两种可能.即舍入前尾数最低位已为0,使其变1,对正数而言,其值变大,等于最低位入了个1.若尾数最低位已为1,则再对其置1无实际效用,等于舍掉了丢失的尾数低位值.
1.5判结果的正确性,即检查阶码是否溢出.浮点数的溢出是以其阶码溢出表现出来的.在加减运算真正结束前,要检查是否产生了溢出,若阶码正常,加(减)运算正常结束;若阶码下溢,要置运算结果为浮点形式的机器零,若上溢,则置溢出标志.
例15:某浮点数阶码6位(含1位符号位:阶符),补码表示,尾数10位(含1位符号位,数符),补码表示,X=2010B*0.11011011B,Y=2100B*(-0.10101100B),求X+Y
由已知条件,Ex=+010B,Mx=0.11011011B,
Ey=+100B,My=-0.10101100B
对应补码分别为
[Ex]补=[+010B]补=[+00010B]补=000010B
[Mx]补=[+0.11011011B]补=[0.110110110B]补=0,110110110B
[Ey]补=[+100B]补=[+00100B]补=000100B
[-Ey]补=111100B
[My]补=[-0.10101100B]补=[-0.101011000B]补=1,010101000B
浮点表示分别为:
数符 阶码尾数数值
[X]浮=0000010 110110110
[Y]浮=1000100 010101000
15_(1)对阶
[△E]补=[Ex]补+[-Ey]补=0000010B+1111100B=1111110B
△E=-00010B=-2,说明X的阶码小,应使Mx右移两位,Ex加2
所以修正[X]浮=000010000110110110
15_(2)尾数求和
0000110110110
+11010101000
1110001010110
15_(3)尾数规格化
尾数运算结果的符号位与最高数值位均为1,应执行左规处理,具体为:将尾数左移一位,符号位1位,结果为1000101011,阶码减1变为000011.
15_(4)尾数移出位的舍入处理
左规已将对阶移出的1位有效1移入,尾数不用做舍入处理.
15_(5)判溢出,写结果
尾数已规格化且阶码符号位为00,没有溢出,最终结果为
[Ex+y]补=000011Ex+y=+00011B
[Mx+y]补=1000101011Mx+y=-0.111010101B
所以,X+Y=2+0011B*(-0.111010101B)
(2)乘法运算
实现X*Y运算,需要如下三步:
2.1尾数相乘(两个定点小数相乘)
2.2阶码求和
2.3结果左规、舍入
例16:某浮点数阶码3位(含1位符号位:阶符),补码表示,尾数3位(含1位符号位,数符),原码表示,X=210B*0.1101B,Y=2-01B*(-0.1011B),求X*Y
由已知条件,Ex=+10B,Mx=0.1101B,
Ey=-01B,My=-0.1011B
对应机器数分别为:
[Ex]补=[+10B]补=010B
[Mx]原=[+0.1101B]原=0,1101B
[Ey]补=[-01B]补=111B
[My]原=[-0.1011B]原=1,1011B
机内浮点表示分别为:
数符 阶码 尾数数值
[X]浮=0010 1101
[Y]浮=1111 1011
16_(1)尾数相乘(Mx*My)
1.1[|Mx|]原=[+0.1101B]原=0,1101B
[|My|]原=[+0.1011B]原=0,1011B
x091.2高位积乘数/低位积
Y0
0000001011
+[Y0*|X|]补001101
001101
右移0001101101
+[Y0*|