深入理解浮点数的表示方法

为了在计算机里面表示浮点数,人们定义了一些标准,来描述浮点数

本文的浮点数介绍基于IEEE 754标准,这个标准广泛运用于许多CPU和浮点处理器上

IEEE的浮点标准为:V = (-1)^s * M * 2^E

  • s为符号位,下图s
  • M为尾数位,及下图的frac
  • E为阶码,为下图的exp
(图1)单精度和双精度浮点数

图1显示的分别是单精度(float) 和双精度(double)表示形式。

 

一个IEEE标准的浮点数是由【规格化数】+【非规格化数】+【特殊的数】组成,下文将分别对这三个组成部分一一介绍:

 

【规格化数】

【定义】:当exp不全为0,也不全为1时则为规格化数

人们为了更广的定义浮点数,对规格化数中的exp进行了细分,在规格化数中最大的exp为2^{^{k}}-2,最小的exp则为1,所以人们在最大最小的两个数中间找到了一个中间值Bias: 2^{k-1}-1,所以大于这个Bias的exp为正指数,小于这个Bias的exp为负指数,所以在规格化数中E = e-Bias ,单精度中这个Bias为127。

看了浮点数的表现形式,就有疑惑了,这个小数点打在哪里?

标准是这样定义【规格数】小数点的:

  1. 对于二进制浮点数,小数点左侧必须只有一位且必须为1
  2. 为了节省空间,小数点的左侧的1须省去(实际计算的时候由硬件电路加上)

所以抽象点想,小数点其实就打在了exp和frac的中间,但对于规格化数的运算时,M=1+frac。

那么单精度的浮点数计算公式:V = (-1)^s * (1 + frac) * 2^{exp-127}

 

【非规格化数】

【定义】:当exp为全0时,所表示的数就是非规格化数

非规格数主要解决的问题是浮点数表示0的问题,其次是解决那些近视于0的数:

  1. 对于二进制浮点数,当exp全为0的时候,小数点左侧必须只有一位且必须为0

所以计算非规格化数的时候,M=0+frac。

不光是这点不同,

非规格数E(指数)的表示方法也不一样,虽然exp为0但是E=1-Bias,为什么这个是1不是0呢??这个其实主要为了保证数据的平滑过渡。

在规格化数中最小的数表达形式是V=(1 + frac)*2^{1-127}取值范围为[2^{-126} , 2^{-125}),而如果非规格数e取0则表达形式为V = frac*2^{-127}取值范围为[0,2^{-127}),所以规格化数和非规格化数中间会产生一个空隙,如果e取1的时候则非规格化数的取值范围为[0,2^{-126}),这样就可以平滑的过渡过去

 

【特殊的数】

最后人们又定义了一些特殊的数:

  1. 当阶码全为1,且尾数位全为0,则该数表示为无穷,s(符号位)为1表示正无穷,为0表示负无穷。
  2. 当阶码全为1,且尾数位不全为0,这表示NaN,该数表示为“Not a Number”(不是一个数),这个东西很有用,当一些运算的结果不能用实数或无穷来表示的时候,就可以用该数表示,例如:\sqrt{-1}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值