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

2021-12-06 23:23:24 +08:00
 hexu
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 架构有关,但在同一台电脑安装的两个不同操作系统的虚拟机上得到的结果一致,让我消除了这个想法)。下面的表格是粗略的几项统计。

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

1418 次点击
所在节点    问与答
7 条回复
secondwtq
2021-12-06 23:49:32 +08:00
你用到了 sin 、cos 、sqrt 等库函数,这些函数 Python 应该是调 C 库对应的函数。C 库是平台相关的。
secondwtq
2021-12-06 23:57:08 +08:00
这些函数一般是软件中使用数值算法实现的(有些架构连乘除都软件实现),不同的算法可以有不同的结果,类似的算法,精度要求不同结果也可以不同。但是好像标准上没有硬性要求。
浮点计算要做到一致还是不那么简单的事情。
ch2
2021-12-07 00:44:49 +08:00
粗瞄一眼,应该是 C 动态库决定的,时间上同一时代、大类的系统应该用的都是同一个编译产物
mineralsalt
2021-12-07 01:36:24 +08:00
所以 java 才经久不衰, 虽然一直被唱衰
muzuiget
2021-12-07 03:07:10 +08:00
都用了浮点数操作了,就要考虑好丢失精度的问题。
JudyHal
2021-12-07 04:27:37 +08:00
@mineralsalt Java Boy 真的恶心,哪里都有你
mineralsalt
2021-12-07 08:41:17 +08:00
@JudyHal 你是不是太极端了, 我好像也没说什么吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/820485

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX