为了在计算机里面表示浮点数,人们定义了一些标准,来描述浮点数
本文的浮点数介绍基于IEEE 754标准,这个标准广泛运用于许多CPU和浮点处理器上
IEEE的浮点标准为::
- s为符号位,下图s
- M为尾数位,及下图的frac
- E为阶码,为下图的exp
图1显示的分别是单精度(float) 和双精度(double)表示形式。
一个IEEE标准的浮点数是由【规格化数】+【非规格化数】+【特殊的数】组成,下文将分别对这三个组成部分一一介绍:
【规格化数】
【定义】:当exp不全为0,也不全为1时则为规格化数
人们为了更广的定义浮点数,对规格化数中的exp进行了细分,在规格化数中最大的exp为,最小的exp则为1,所以人们在最大最小的两个数中间找到了一个中间值Bias: ,所以大于这个Bias的exp为正指数,小于这个Bias的exp为负指数,所以在规格化数中 ,单精度中这个Bias为127。
看了浮点数的表现形式,就有疑惑了,这个小数点打在哪里?
标准是这样定义【规格数】小数点的:
- 对于二进制浮点数,小数点左侧必须只有一位且必须为1
- 为了节省空间,小数点的左侧的1须省去(实际计算的时候由硬件电路加上)
所以抽象点想,小数点其实就打在了exp和frac的中间,但对于规格化数的运算时,M=1+frac。
那么单精度的浮点数计算公式:
【非规格化数】
【定义】:当exp为全0时,所表示的数就是非规格化数
非规格数主要解决的问题是浮点数表示0的问题,其次是解决那些近视于0的数:
- 对于二进制浮点数,当exp全为0的时候,小数点左侧必须只有一位且必须为0
所以计算非规格化数的时候,M=0+frac。
不光是这点不同,
非规格数E(指数)的表示方法也不一样,虽然exp为0但是,为什么这个是1不是0呢??这个其实主要为了保证数据的平滑过渡。
在规格化数中最小的数表达形式是取值范围为,而如果非规格数e取0则表达形式为取值范围为,所以规格化数和非规格化数中间会产生一个空隙,如果e取1的时候则非规格化数的取值范围为,这样就可以平滑的过渡过去
【特殊的数】
最后人们又定义了一些特殊的数:
- 当阶码全为1,且尾数位全为0,则该数表示为无穷,s(符号位)为1表示正无穷,为0表示负无穷。
- 当阶码全为1,且尾数位不全为0,这表示NaN,该数表示为“Not a Number”(不是一个数),这个东西很有用,当一些运算的结果不能用实数或无穷来表示的时候,就可以用该数表示,例如: