博客已迁移至https://drivingc.com,本站停止更新.

关于浮点数float精度误差问题

浮点数有精度误差的原因

简单来说是:计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

十进制整数转二进制大家高中都学过

除以2,商继续除以2,得到0为止,将余数逆序排列

10 / 2  商5 余0
5 / 2  商2 余1
2 / 2  商1 余0
1 / 2  商0 余1
所以10的的二进制是1010

但是十进制小数转二进制如何计算?

乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列

0.8125 x 2  等于1.625 取1
0.625 x 2  等于1.25 取 1
0.25 x 2  等于0.5 取 0
0.5 x 2  等于1.0 取 1
所以0.8125的二进制是0.1101

那么问题就来了,比如你想计算10进制0.2的2进制:

0.2 x 2 0.4
0.4 x 2 0.8
0.8 x 2 1.6
0.6 x 2 1.2
0.2 x 2 0.4
……

出现了无限循环的情况,当计算到超出float类型长度的时候就会出现误差

避免误差

相差越小的数累积起来误差会越小.

两个相差很大的数相加

a = 1000000000
for i in xrange(1000000):
    a = a + 1e-6
print(a-1000000000)

输出为0.95

如果将10亿换成1,误差会变小

a = 1
for i in xrange(1000000):
    a = a + 1e-6
print(a-1)

输出为0.99999999992

本文链接:https://kupposhadow.com/p/5964749394ae586afd19f643
本站采用「署名 4.0 国际(CC BY 4.0)」创作共享协议。只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、二次创作、商业性使用。
这篇文章还没有评论