V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hexu
V2EX  ›  问与答

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

  •  
  •   hexu · 2021-12-06 23:23:24 +08:00 · 1450 次点击
    这是一个创建于 1107 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条回复    2021-12-07 08:41:17 +08:00
    secondwtq
        1
    secondwtq  
       2021-12-06 23:49:32 +08:00
    你用到了 sin 、cos 、sqrt 等库函数,这些函数 Python 应该是调 C 库对应的函数。C 库是平台相关的。
    secondwtq
        2
    secondwtq  
       2021-12-06 23:57:08 +08:00
    这些函数一般是软件中使用数值算法实现的(有些架构连乘除都软件实现),不同的算法可以有不同的结果,类似的算法,精度要求不同结果也可以不同。但是好像标准上没有硬性要求。
    浮点计算要做到一致还是不那么简单的事情。
    ch2
        3
    ch2  
       2021-12-07 00:44:49 +08:00
    粗瞄一眼,应该是 C 动态库决定的,时间上同一时代、大类的系统应该用的都是同一个编译产物
    mineralsalt
        4
    mineralsalt  
       2021-12-07 01:36:24 +08:00
    所以 java 才经久不衰, 虽然一直被唱衰
    muzuiget
        5
    muzuiget  
       2021-12-07 03:07:10 +08:00
    都用了浮点数操作了,就要考虑好丢失精度的问题。
    JudyHal
        6
    JudyHal  
       2021-12-07 04:27:37 +08:00
    @mineralsalt Java Boy 真的恶心,哪里都有你
    mineralsalt
        7
    mineralsalt  
       2021-12-07 08:41:17 +08:00
    @JudyHal 你是不是太极端了, 我好像也没说什么吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5548 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:03 · PVG 14:03 · LAX 22:03 · JFK 01:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.