浮点数的加减乘除运算步骤
1、浮点加减法的运算步骤
设两个浮点数 X=Mx2Ex Y=My2Ey
实现X±Y要用如下5步完成:
对阶操作:小阶向大阶看齐
进行尾数加减运算
规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是
001×××…×× 110×××…××的形式
若不符合上述形式要进行左规或右规处理。
舍入操作:在执行对阶或右规操作时常用“0”“1”入法将右移出去的尾数数值进行舍入,以确保精度。
判结果的正确性:即阶码是否溢出
若阶码下溢(移码表示是00…0),要置结果为机器0
若阶码上溢(超过了阶码表示的最大值)置溢出标志。
例题:假定X=0 .0110011*211Y=0.1101101*2-10(此处的数均为二进制) ?? 计算X+Y
解:[X] 010 *******
    [Y] 0 0 110 1101101
            符号位 阶码 尾数

第一步:求阶差: │ΔE│=|1010-0110|=0100
第二步:对阶:Y的阶码小,小数的原码 Y的尾数右移4
        [Y]变为 010 *******暂时保存 
第三步:尾数相加,采用双符号位的补码运算 
    00 1100110 
  +00 0000110 
    00 1101100
第四步规格化:满足规格化要求 
第五步:舍入处理,采用01入法处理
故最终运算结果的浮点数格式为: 010 *******
X+Y=+0. 1101101*210 
2、浮点乘除法的运算步骤
阶码运算:阶码求和(乘法)或阶码求差(除法)
      [Ex+Ey]= [Ex]+ [Ey] 
        [ExEy]= [Ex]+ [Ey]
浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理
例题:X=0 .0110011*211Y=0.1101101*2-10
XY
解:[X] 010 *******
    [Y] 0 0 110 1101101
第一步:阶码相加 
[Ex+Ey]=[Ex]+[Ey]=1 010+1 110=1 000 
1 000为移码表示的0
第二步:原码尾数相乘的结果为:
0 10101101101110
第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。
第四步:舍入处理:按舍入规则,加1进行修正
所以 XY= 0.10101112+000
PIC单片机的浮点数及其与十进制数之间的相互转换
重点说明浮点数的格式,十进制数与浮点之间的相互转换以及程序设计。
  关键词 Microchip    单片机  浮点数  十进制数    相互转换
    由美国Microchip公司生产的PIC系列单片机,因其功耗低,超小型,低成本,功能完整,非常适用于便携式仪表和就地式显示控制仪表,在国内越来越受到用户的重视和广泛的应用。
    在我们设计的仪表中采用PIC系列单片机,碰到了浮点数的运算问题,查阅其有关资料发
现,其浮点数的格式及其与十进制数之间的转换,与我们常用的MCS-51单片机所提供的三字节、四字节浮点数完全不同,本文将说明其浮点数的格式及其与十进制数之间的转换和程序设计步骤。
1 浮点数的格式
Microchip公司所采用的浮点数格式是IEEE-754标准的变异型。32位浮点数格式为:
   
    其中:×表示一位二进制数01eb 为指数的偏差;S为浮点数的符号位,S=0为正数,S=1为负数;小数点“·”在符号位S的右边;BY0 BY1 BY2为尾数的小数部分。
    应特别注意:
    浮点数隐含其整数部分为1
    十进制数0 的浮点数表示为00H,00H, 00H, 00H
2 浮点数与十进制数之间的相互转换
2.1 十进制数转换成浮点数
    :十进数为A,2Z=AZ= lnA/ln2,指数P=int(z);尾数部分X: X=A/2P, 其整数部分隐含为1(零除外),将其小数部分按原码格式化为二进制数,即为尾数的小数部分BY0 BY1 BY2。而指数偏差eb=P+7FH(其中的7FH 为指数的偏移量)。符号位S,视十进制数的正负而确定。
    例如十进制数50.265化为32位规格化浮点数:A=50.265,则Z=ln50.265/ln2P=int(Z),P=5; X=A/2P=50.265/25=1.57078125,将0.57078125化为23位二进制小数,即是BY0 BY1 BY2,在最高位添上十进制数的符号位S(因十进制数为正数,故S=0);而eb=P+7FH,所以,十进制数50.26532位规格化浮点数即为84H49H0FH5CH
2.2 浮点数转换为十进制数
    设浮点数为 eb S.BY0 BY1 BY2。由于浮点数隐含尾数的整数为1,故尾数X的实际值为:
      BY0 BY1 BY2;指数P=eb7FH;:十进制数
                A=(1)S×2P×X
    例:32位规格化浮点数84H,49H,0FH,5CH转换为十进制数。
    符号位S=0;指数P=84H7FH,故P=5; 尾数的小数部分为49H,0FH,5CH左移一位,而尾数的整数部分隐含为1,故尾数X的实际值为:1.57078123;十进制数A=(1)0×25×1.57078123,即A=50.265
3 浮点数与十进制数相互转换的程序设计
3.1 浮点数转换为十进制数的程序设计
    1)检测浮点数是否为零;若为零,则十进制数整数部分和小数部分均为零。
    2)保存浮点数的符号位,将浮点数隐含的1置于浮点数的符号位,指数偏差eb1,小数点移到原浮点数的符号位之前。
    3)判断指数偏差大于7FH否?若小于等于7FH,则该进制数整数部分为零,浮点数尾数
部分右移n(注:n=7FH-指数偏差eb), 即求得二进制小数部分。若大于7FH,则将小数点右移n(:n’=指数偏差eb7FH),即求得二进制整数部分和小数部分。
    4)将二进制整数部分转换为十进制整数 ;将二进制小数部分转换为十进制小数。至此,完成了浮点数到十进制数的转换。
3.2 十进制数转换为浮点数的程序设计
    1)检测十进制数是否为零,若为零,则浮点数置成00H,00H,00H,00H
浮点数保存的字节格式如下:

地址 +0 +1 +2 +3
内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

这里
S 代表符号位,1是负,0是正
E 偏移127的幂,二进制阶码=(EEEEEEEE)-127
M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了
较高的有效位数,提高了精度。

零是一个特定值,幂是0 尾数也是0

浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:
地址 +0 +1 +2 +3
内容0xC1 0x48 0x00 0x00

浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转
换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表
所列的那样分开,例如:

地址 +0 +1 +2 +3
格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
二进制 11000001 01001000 00000000 00000000
十六进制 C1 48 00 00

从这个例子可以得到下面的信息:
符号位是1 表示一个负数
幂是二进制10000010或十进制130130减去1273,就是实际的幂。
尾数是后面的二进制数10010000000000000000000


在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数
点到尾数的开头,得到尾数值如下:
1.10010000000000000000000

接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为
指数是3,尾数调整如下:
1100.10000000000000000000

结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示
(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12
小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.表示(1*2^(-1))+
(0*2^(-2))+(0*2^(-2))...=0.5
这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-
12.5