当前位置:   article > 正文

浮点数的存储方式

浮点数的存储方式

目录

一、浮点数存储方式分类

二、浮点实数存储方式

2.1 如何把浮点数转为二进制数

 2.2 为什么浮点数存在精度问题

三、double类型如何存储


为什么浮点数不适合比较大小和比较相等的操作?原先只听说跟浮点数的精度有关,浮点数为什么会有精度缺失问题?需要看一下浮点数在计算机中如何存储。

一、浮点数存储方式分类

在计算机发展过程中,出现了两类存储方式,分别是定点实数存储和浮点实数存储方式:

1、定点实数存储方式:约定整数位和小数位的存储长度,比如高两位放整数位,低两位存放小数位。

优点是方便计算;缺点是存储的数据范围有限;

2、浮点实数存储方式:用一部分二进制位存放小数点位置,称为“指数域”,其他全部用来存储没有小数点时的数据和符号,称为“数据位”、“符号域”。

优点是存储的数据范围更大;缺点是计算比定点实数存储慢些;

80286出现后,有了浮点协处理器,计算实数的效率提升了,浮点实数存储方式得到普及,成为了主流。

二、浮点实数存储方式

以32位操作系统为例,单精度浮点数类型float占四字节,双精度浮点数类型double类型占八字节。浮点数在转换为二进制存储时,需要使用科学计数法,通过科学计数法把浮点数拆分成三部分:符号位、指数位、尾数位。

由于指数为负,所以规定了指数位的值=科学计数法中的指数+127。

 F:符号位,占1位,1表示负,0表示正

Z:指数位,占8位,不足8位,高位补0

W:尾数位,占23位,不足23位,低位补0

2.1 如何把浮点数转为二进制数

以12.25为例,整数部分我们都知道十进制转为二进制的方法,比如12 = 2^3 +  2^2 =》 1100,从最低开始往左代表,为2^0、2^1、2^2.......所以小数的表示从20往右,分别代表2^-1、2^-2、2^-3、2^-4、......

 0.25 = 2^-2 =》 10,所以12.25转换为二进制即1100.01 用科学计数法表示为1.10001 x 2^3 ,存储时,符号位为0,指数位为3+127 = 130 =》 10000010,尾数为10001所以在小端模式下存储为:

 2.2 为什么浮点数存在精度问题

以1.3这个有穷数为例,0.3 = 2^-2+2^-5+2^-6+2^-9+2^-10+2^-13......

转换为二进制变成了1.0100110011001100110011001......

变成了无穷数,这个时候只能在第23位舍0进1,即1.0100110011001100110010

最终在内存中存储为:

由于在转换的过程中,丢失了位数,所以这只是近似值,如果把这个近似数转为十进制小数,会得到1.2516582,这就是为什么在比较浮点数相等时,一般建议我们使用区间而不是直接等值比较,而由于这种编码方式,可以发现,绝对值越大的数,精度越大,因为绝对值大时,整数部分占太多位置,小数部分舍弃的多。

三、double类型如何存储

double类型是双精度类型,在32位操作系统中占8字节,doube类型的编码方式跟float类型是差不多的,也是分为符号位、指数位、尾数位,只是长度跟float不同。其中符号位占一位,指数位占11位,指数位的值=指数+1023,剩下的位数存尾数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/438517
推荐阅读
相关标签
  

闽ICP备14008679号