hexu
V2EX  ›  问与答

在不同机器/操作系统上运行相同 Python 程序,可能得到不同结果

  •  
  •   hexu · Dec 6, 2021 · 2234 views
    This topic created in 1625 days ago, the information mentioned may be changed or developed.
    from math import *
    def a(n):
        return sin(n+sqrt(2*n+3/n)*pi)+cos((n-(3*n-n/5)**3)*e)
    def sum_a(m,n):
        return sum([a(i) for i in range(m,n+1)])
    m = 100;n = 9000
    print("%.6f"%sum_a(m,n))
    

    这样一段代码,在不同的机器或者操作系统运行上会出现不同的结果。

    起因是胡乱捣鼓,然后发现这串代码在自己的笔记本电脑(Windows10)和虚拟机(Ubuntu)上结果不同,然后继续做了几项测试,发现确实不一样。原因猜想可能与操作系统有关(最开始考虑过可能和 CPU 架构有关,但在同一台电脑安装的两个不同操作系统的虚拟机上得到的结果一致,让我消除了这个想法)。下面的表格是粗略的几项统计。

    image.png

    不知道大家能不能给出奇妙的见解。或者说在自己的电脑 /服务器上也跑出来奇奇怪怪的答案(笑)

    7 replies    2021-12-07 08:41:17 +08:00
    secondwtq
        1
    secondwtq  
       Dec 6, 2021
    你用到了 sin 、cos 、sqrt 等库函数,这些函数 Python 应该是调 C 库对应的函数。C 库是平台相关的。
    secondwtq
        2
    secondwtq  
       Dec 6, 2021
    这些函数一般是软件中使用数值算法实现的(有些架构连乘除都软件实现),不同的算法可以有不同的结果,类似的算法,精度要求不同结果也可以不同。但是好像标准上没有硬性要求。
    浮点计算要做到一致还是不那么简单的事情。
    ch2
        3
    ch2  
       Dec 7, 2021
    粗瞄一眼,应该是 C 动态库决定的,时间上同一时代、大类的系统应该用的都是同一个编译产物
    mineralsalt
        4
    mineralsalt  
       Dec 7, 2021
    所以 java 才经久不衰, 虽然一直被唱衰
    muzuiget
        5
    muzuiget  
       Dec 7, 2021
    都用了浮点数操作了,就要考虑好丢失精度的问题。
    JudyHal
        6
    JudyHal  
       Dec 7, 2021
    @mineralsalt Java Boy 真的恶心,哪里都有你
    mineralsalt
        7
    mineralsalt  
       Dec 7, 2021
    @JudyHal 你是不是太极端了, 我好像也没说什么吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1238 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 17:48 · PVG 01:48 · LAX 10:48 · JFK 13:48
    ♥ Do have faith in what you're doing.