V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Qzier
V2EX  ›  Python

为什么计算顺序会影响浮点数求和的精度?

  •  1
     
  •   Qzier · 2020-01-22 23:57:20 +08:00 · 3862 次点击
    这是一个创建于 1772 天前的主题,其中的信息可能已经有所发展或是发生改变。
    sum = 0
    for i in range(1, 501):
        sum += 1 / i
    print(sum)
    
    sum = 0
    for i in range(500, 0, -1):
        sum += 1 / i
    print(sum)
    

    两种结果的精度为何不同?

    6.79282342999052
    6.7928234299905235
    
    6 条回复    2020-01-23 13:39:35 +08:00
    yexiaoxing
        1
    yexiaoxing  
       2020-01-23 00:34:47 +08:00   ❤️ 1
    sum 本身也是个浮点数
    msg7086
        2
    msg7086  
       2020-01-23 01:08:16 +08:00 via Android
    浮点计算每次都可能产生误差,计算顺序当然会影响结果了。
    nalzok
        3
    nalzok  
       2020-01-23 01:38:35 +08:00   ❤️ 1
    考虑这个更简单的例子

    >>> (1 + 0.0000000000000001) + 0.0000000000000001
    1.0
    >>> 1 + (0.0000000000000001 + 0.0000000000000001)
    1.0000000000000002

    至于为什么呢,因为

    >>> 1 + 0.0000000000000001
    1.0
    >>> 1 + 0.0000000000000002
    1.0000000000000002

    简单来说,0.0000000000000001 加到 1 上之后就因为精度有限的关系被 discard 掉了;但是如果你先把两个 0.0000000000000001 合成一个 0.0000000000000002 再加到 1 上面,那么这个数字就会因为足够大而不会被 discard
    Mutoo
        4
    Mutoo  
       2020-01-23 05:46:14 +08:00
    误差主要来自无法用二进制精确表达的十进制。不同的累家顺序会导致这样的十进制出现的情况不同。
    hobochen
        5
    hobochen  
       2020-01-23 13:19:27 +08:00
    @Mutoo 误差不是浮点数本身精度有上限吗?和进制转换没关系吧?
    Mutoo
        6
    Mutoo  
       2020-01-23 13:39:35 +08:00
    @hobochen 涉及到十进制小数,关系就大了。经典的 0.1+0.2 != 0.3
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2433 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.