代码之家  ›  专栏  ›  技术社区  ›  user1658887

为什么**2!=a*a一些彩车?

  •  13
  • user1658887  · 技术社区  · 6 年前
    $ python --version
    Python 2.7.15
    
    $ type test.py
    import random
    
    while True:
        a = random.uniform(0, 1)
        b = a ** 2
        c = a * a
        if b != c:
            print "a = {}".format(a)
            print "a ** 2 = {}".format(b)
            print "a * a = {}".format(c)
            break
    
    $ python test.py
    a = 0.145376687586
    a ** 2 = 0.0211343812936
    a * a = 0.0211343812936
    

    我只能在Python的Windows版本上重现这一点——准确地说: Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32 .我的 Arch Linux Python的盒式安装( Python 2.7.15 (default, May 1 2018, 20:16:04) [GCC 7.3.1 20180406] on linux2 )循环似乎没有终止,这表明 a**2 = a * a 不变量在那里保持不变。

    这是怎么回事?我知道IEEE浮点数有过多的误解和特质( this ,例如,没有回答我的问题),但我看不到规范的哪一部分或 ** 可能会考虑到这一点。

    解决重复标记问题:这很可能不是直接的IEEE浮点数学问题,更可能是 ** 操作人员因此,这不是一个重复的问题,这些问题只询问浮点问题,如精度或关联性。

    2 回复  |  直到 6 年前
        1
  •  15
  •   Eric Postpischil    6 年前

    Python的浮点运算依赖于底层平台。我假设蟒蛇 ** 操作员使用 pow 实施(如C中所用)(由 user2357112 指的是Python 2.7.15 source code ).

    通常地 战俘 部分通过使用(近似)对数和指数来实现。这是必要的,因为 战俘 支持非整数参数。(当然,这种通用实现并不排除对其域子集的专门化。)

    微软 战俘 众所周知,执行情况并不好。因此 pow(a, 2) ,它可能返回的结果不等于 a*a .

        2
  •  9
  •   Jean-François Fabre    6 年前

    a ** 2 使用 浮点数 幂函数(就像你可以在标准的C数学库中找到的那样),它可以将任意数提升到任意幂。

    a * a 只是在成倍增长 一旦 ,它更适合这种情况,并且不容易出现精度错误(对于整数更是如此),比如 a**2 会的。

    对于浮点 a ,如果你想通过使用

    a * a * a * a * a
    

    你最好和我一起去 a**5 因为重复乘法现在容易出现浮点累加错误,而且速度要慢得多。

    a ** b 更有趣的是 b 它很大,例如,因为它更高效。但精度可能会有所不同,因为它使用浮点算法。

    推荐文章