推荐学习书目
› 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 · Jan 22, 2020 · 4789 views
    This topic created in 2438 days ago, the information mentioned may be changed or developed.
    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 replies  •  2020-01-23 13:39:35 +08:00
    yexiaoxing
        1
    yexiaoxing  
       Jan 23, 2020   ❤️ 1
    sum 本身也是个浮点数
    msg7086
        2
    msg7086  
       Jan 23, 2020 via Android
    浮点计算每次都可能产生误差,计算顺序当然会影响结果了。
    nalzok
        3
    nalzok  
       Jan 23, 2020   ❤️ 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  
       Jan 23, 2020
    误差主要来自无法用二进制精确表达的十进制。不同的累家顺序会导致这样的十进制出现的情况不同。
    hobochen
        5
    hobochen  
       Jan 23, 2020
    @Mutoo 误差不是浮点数本身精度有上限吗?和进制转换没关系吧?
    Mutoo
        6
    Mutoo  
       Jan 23, 2020
    @hobochen 涉及到十进制小数,关系就大了。经典的 0.1+0.2 != 0.3
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   866 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 19:55 · PVG 03:55 · LAX 12:55 · JFK 15:55
    ♥ Do have faith in what you're doing.