浮点数的表示与运算

致敬每一个被计组折磨的人

浮点数的表示是为了以有限的位数,表示更大范围更精确的数字。浮点数的表示方法类似于科学计数法,回顾一下

  • 123456科学计数法表示为1.23456 x 10^6
  • 123.456 x 10^3用科学计数法表示为1.23456 x 10^6。
  • 以上面一个为例,科学计数法只保留一位整数,23456为尾数,6为阶码 10为基数
 浮点数的表示格式

N=(-1)^{S}\ast M\ast R^{E}

        例如-8.25如何用浮点数表示呢?

        因为计算机都是二进制存储,所以需要先将其转变为二进制表示,-8.25的二进制表示为1000.01

        S是正负标志位,用一个位表示,S=0则(-1)^{0}=1表示该浮点数为正数,否则(-1)^{1}=-1表示该浮点数为负数

        M表示尾数,等效于上述科学计数法示例的23456,但示例的是整数,在这里的应该是小数部分01

        R为基数,这里是二进制所以基数是2

        E阶码,这个例子中为0

存储表示为

符号阶码尾数
SEM

        到这里有没有发现问题?如果这样存储,-8.25就变成了1 0 01了(为了方便这里没有给各部分限定位数),按公式还原,回不来了,这是因为尾数M只存小数点右侧(小数部分),左侧丢失(整数部分)。所以这样存储是不可以的,我们需要像科学计数法一样,在小数点左侧只保留一位非零整数(二进制中就是1)

仿照十进制的科学计数法,将小数点向左移保证小数点左边就剩下一位-1000.01=-1.00001\ast 2^{3}(注意因为是二进制这里的基数不是科学计数法的10变成2了,小数点左移指数+1,右移一位指数-1,所谓左加右减嘛!这里左移了三位所以是2^{3}

        此时S=-1 E=3 M=00001,回顾公式你会发现 R和1不见了,这就是浮点数存储的两个隐藏点,因为是二进制存储,所以基数R默认为2,同时因为对二进制数进行格式标准化,所以小数点左侧的整数部分一定会有一个1,因此在存储中不作说明去占用其位数。

        这已经能大致表示浮点数了,但在实际的存储中,阶码都不是直接存储的,而是需要偏移,例如这里的阶码是3,如果偏移值是127,则实际存储的E=3+127=130;

IEEE754标准

这个标准规定了浮点数存储的格式偏移值,根据字节长度不同,存储位数不一样,精度也不一样分为单精度(float)和双精度(double),这里以单精度浮点型为例,单精度浮点型存储空间为4个字节,一共32位,其中用一位表示S,8位表示阶码E,23位表示尾数M,偏移值为127。不用看那么多,IEEE754标准就是规定了这两个东西,其他的都一样。

        例如用该标准去存储-8.25,先将-8.25转化为二进制-1000.01,再格式化保留,小数点左边只保留一位非0整数为1.00001\times 2^{3}

  • S=1
  • E=3+127(IEEE754标准的单精度浮点的偏移值127)=130=1000 0010 (0000 0011+0111 1111)
  •  M=0000 1000 0000 0000 0000 000
  • 合在一起为1 1000 0010 0000 1000 0000 0000 0000 000 = 1100 0001 0000 0100 0000 0000 0000 0000
 左规和右规

        在浮点数计算过程中,如果计算结果出现下述情况,则需要进行格式规整

  • 最高位为0例如1.001-1.0001=0.0001(二进制加减),最高位为0则需要小数点右移四位使得最高位为1,此时阶码减4,有效数1左移,称为左规
  • 最高位有效位大于1,例如1.001+1.001=10.010(二进制加减),最高位大于1则需要小数点左移一位使得最高位为1,此时阶码加1,有效数1右移,称为右规
  • 无论左规还是右规都是一个目的,通过移小数点,保持最高位等于1。
  • 左规右规一般指在浮点数的计算过程中,左规一般可以移多位小数点,右规最多只要移一位

 

浮点数的表示范围 

假定一个 浮点数的范围是-100到+100

  • 两个浮点数相加99+99=+198>+100表示正上溢
  • 两个浮点数相减-99-99=-198<-100表示负上溢
  • 由于浮点数受存储空间限制,不能完全表示空间的数,其实这个二进制表示的数都得离散的不是连续的,例如尺子量东西的时候,一般刻度精度到mm,物体刚好在两个mm刻度中间时需要估算,计算机存储浮点数也是,只不过刻度比较密集,但还是有间隔。尺子的刻度间隔是mm,浮点数的刻度间隔假定为g
  • 当两个浮点数进行运算时,结果小于+g的为正下溢,结果大于-g的为负下溢,下溢就是精度丢失,无论正负,太小了都视为0,例如两个浮点数相减结果是0.0000000000000000001,但这个浮点数只能表示到0.0000 0001,所以就将0.0000000000000000001视为下溢,直接当0处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值