赞
踩
目录
为什么浮点数不适合比较大小和比较相等的操作?原先只听说跟浮点数的精度有关,浮点数为什么会有精度缺失问题?需要看一下浮点数在计算机中如何存储。
在计算机发展过程中,出现了两类存储方式,分别是定点实数存储和浮点实数存储方式:
1、定点实数存储方式:约定整数位和小数位的存储长度,比如高两位放整数位,低两位存放小数位。
优点是方便计算;缺点是存储的数据范围有限;
2、浮点实数存储方式:用一部分二进制位存放小数点位置,称为“指数域”,其他全部用来存储没有小数点时的数据和符号,称为“数据位”、“符号域”。
优点是存储的数据范围更大;缺点是计算比定点实数存储慢些;
80286出现后,有了浮点协处理器,计算实数的效率提升了,浮点实数存储方式得到普及,成为了主流。
以32位操作系统为例,单精度浮点数类型float占四字节,双精度浮点数类型double类型占八字节。浮点数在转换为二进制存储时,需要使用科学计数法,通过科学计数法把浮点数拆分成三部分:符号位、指数位、尾数位。
由于指数为负,所以规定了指数位的值=科学计数法中的指数+127。
F:符号位,占1位,1表示负,0表示正
Z:指数位,占8位,不足8位,高位补0
W:尾数位,占23位,不足23位,低位补0
以12.25为例,整数部分我们都知道十进制转为二进制的方法,比如12 = + =》 1100,从最低开始往左代表,为、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所以在小端模式下存储为:
以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类型是双精度类型,在32位操作系统中占8字节,doube类型的编码方式跟float类型是差不多的,也是分为符号位、指数位、尾数位,只是长度跟float不同。其中符号位占一位,指数位占11位,指数位的值=指数+1023,剩下的位数存尾数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。