计组—浮点数表示和运算

关注微信公众号“虾米聊吧” 获取所有资料干货,每天更新技术干货,一起交流一起学习~

 

浮点数的表示

科学计数法

任意一个十进制数N可以写成:

同样,在计算机中一个任意进制数N可以写成

在计算机的世界里R默认是2,表示二进制,因此R在计算机中不用单独存储,而M和e需要单独存储

 

尾数(M):用定点小数表示,给出有效数字的位数,决定了浮点数的表示精度

阶码(E):表示指数(并不等同于e,他们之间有一种对应关系),用整数形式表示,指明小数点在数据中的位置,决定了浮点数的表示范围

比例因子(R):不表示,默认值,一般为2

 

问题:在计算机中各个部分分别占据多少位?

IEEE754标准浮点数的表示方法

单精度float总共32位

 

32位的浮点数中:

S:浮点数的符号位(即最高位表示符号位),占1位,0表示正数,1表示负数

M:尾数,占23位,用小数表示,小数点放在尾数域的最前面

E:阶码,占8位,阶符采用隐含方式,即采用移码方式来表示正负指数

指数e和阶码E之间的对应关系,应将指数e加上一个固定的偏移值,即:E=e+127

 

IEEE754标准中,一个规格化的32位浮点数 x的真值可表示为

其中(-1)^s,s表示符号位,s=0则(-1)^0=1为正数,s=1则(-1)^1=-1为负数;

M表示阶码,默认为1 * M,e=E-127

其中,S、M、E都存在计算机中,而其它数值都是默认固定的

 

64位的浮点数:

S:浮点数的符号位(即最高位表示符号位),占1位,0表示正数,1表示负数

M:尾数,占51位,用小数表示,小数点放在尾数域的最前面

E:阶码,占11位,阶符采用隐含方式,即采用移码方式来表示正负指数

 

同理一个规格化的64位浮点数x的真值为:

 

例:

 

说明:

(1.75)10 = 1.11 * 2^0

对于32位的浮点数来说:

所以因为是正数S=0

因为是1.M的格式,所以M=1100000...0 (因为总共23位,存在2个1,所以后面21个0)

因为e=0,而E=127+e,所以E=127

 

补充说明:

(1)当阶码E为全0(0000,0000)且尾数M也为全0时,表示的真值x为零,结合符号位S为0或1,有正零和负零之分。

(2)当阶码E位全1(1111,1111即255)且尾数M为全0(0000,0000)时,表示的浮点数为无穷大,结合符号位S为0或1,也有+无穷和-无穷之分

因此在32位浮点数表示中,要除去E用全00000000和全11111111(255)10表示零和无穷大的特殊情况,因此阶码E的取值范围为00000001(1)到11111110(254);又因为e=E-127,所以e的取值范围为(1-127) ~ (254-127)即 -126 ~ +127

 

浮点数的加减运算

两浮点数进行加法和减法的运算规则即操作过程大体分为四步:

1.0操作数的检查

    判断两个操作数x或y中有一个数为0,则直接得出结果

2.比较阶码大小并完成对阶

    判断两个操作数的阶码是否相同,如果相同则直接进行尾数的加减法运算。如果不同则需要使两个操作数的阶码相同即对阶,首先求出两个数的阶差,由于尾数左移会引起最高有效位的丢失,造成很大的误差,尾数右移虽引起最低有效位的丢失,但造成的误差较小,因此对阶操作规定使尾数右移,尾数右移后阶码作相应增加,其数值保持不变。显然,一个增加后的阶码与另一个阶码相等,增加的阶码一定是小阶。

因此对阶的原则是小阶向大阶看齐,即小阶的位数向右移位(相当于小数点左移)每右移一位,其阶码加1,直到两数的阶码相等为止,右移得位数等于阶差。

3.尾数进行加或减法运算

4.结果规格化并进行舍入处理

规格化:

1/2 =< |M| < 1

(M是小数,所谓M>=1/2 即:|M|>=0.1,因为是按二进制处理,1/2即右移一位即0.1)

 

但在浮点运算中,尾数求和结果的绝对值大于1(即溢出符号位为01或10),叫做向左破坏了规格化;此时将尾数运算结果右移以实现规格化表示,称为向右规格化;尾数右移一位,阶码加1;以保证浮点数大小不变;

运算结果的绝对值小于1/2,叫做向右破坏规格化,此时将尾数结果左移实现规格化表示,称为向左规格化;尾数左移一位,阶码减1,以保证浮点数大小不变;

(1)尾数用原码表示,[S]原=Sf.S1S2....Sn,如果尾数未发生溢出,但S1=0,则向右规格化,即S1必须等于1,否则需要进行规格化处理

(2)尾数用补码来表示,[S]补=Sf.S1S2....Sn,如果尾数未发生溢出,但Sf 异或 S1=0,即Sf和S1相同,则向右破坏规格化

 

浮点数的溢出是以阶码溢出表现出来的(因为如果是尾数溢出可以通过相应的右移处理,所以尾数溢出称为假溢出)。在加减法运算过程中要检查是否产生了溢出;若阶码正常加(减)运算正常结束;若阶码溢出,则要进行相应处理

 

qq群 :557911445  个人qq:193459197

关注微信公众号“虾米聊吧”,后续持续放送“技术架构和资料”干货!!!

   一个热衷于分享技术和生活的程序猿,让我们一起交流吧~      

                    

                  微信扫描二维码,关注我的公众号
 

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值