浮点数的精度问题

  • Post author:
  • Post category:其他




浮点数的存储方式

float

1bit(符号位) 8bits(指数位) 23bits(尾数位)

double

1bit(符号位) 11bits(指数位) 52bits(尾数位)



知识补充—二进制表示的小数

对于二进制的小数:

1.1=1×2

0

+1×2

-1

=1+1/2=1.5;

1.01=1×2

0

+0×2

-1

+1×2

-2

=1+1/4=1.25

1.0011=1×2

0

+0×2

-1

+0×2

-2

+1×2

-3

+1×2

-4

=1+1/8+1/16=1.1875

这样看下去,只要有足够的位数,二进制的小数就可以像十进制数一样表示任何数。但是计算机存储空间是有限的。为了用有限的空间近似出尽量多的小数,制定了一些标准,主要是IEEE754标准。



符号位

0代表正数,1代表负数。



指数位

一共8bit 能表示的数是0-255。因为要表示小数,肯定要有负指数,则指数的范围就是-127-128。



尾数位

这里存储的是真正的二进制小数。



计算方法

以0.09f为例,它的存储是这样的:0 01111011 01110000101000111101100

符号位:0 正数

指数位: 01111011对应十进制的123,加上符号以后就是123-127=-4

尾数位: 此处省略整数部分的1,即为:1.01110000101000111101100

然后计算方式为:

1.01110000101000111101100 * 2^-4

=0.000101110000101000111101100

= 1/16 + 1/64 + 1/128+ 1/256 + …

= 0.0900000035762786865234375

这就是0.09在内存里的存储方式。所以它是不精确的。64位双精度浮点数类似。



版权声明:本文为weixin_43243484原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。