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 架构有关,但在同一台电脑安装的两个不同操作系统的虚拟机上得到的结果一致,让我消除了这个想法)。下面的表格是粗略的几项统计。
不知道大家能不能给出奇妙的见解。或者说在自己的电脑 /服务器上也跑出来奇奇怪怪的答案(笑)
1
secondwtq 2021-12-06 23:49:32 +08:00
你用到了 sin 、cos 、sqrt 等库函数,这些函数 Python 应该是调 C 库对应的函数。C 库是平台相关的。
|
2
secondwtq 2021-12-06 23:57:08 +08:00
这些函数一般是软件中使用数值算法实现的(有些架构连乘除都软件实现),不同的算法可以有不同的结果,类似的算法,精度要求不同结果也可以不同。但是好像标准上没有硬性要求。
浮点计算要做到一致还是不那么简单的事情。 |
3
ch2 2021-12-07 00:44:49 +08:00
粗瞄一眼,应该是 C 动态库决定的,时间上同一时代、大类的系统应该用的都是同一个编译产物
|
4
mineralsalt 2021-12-07 01:36:24 +08:00
所以 java 才经久不衰, 虽然一直被唱衰
|
5
muzuiget 2021-12-07 03:07:10 +08:00
都用了浮点数操作了,就要考虑好丢失精度的问题。
|
6
JudyHal 2021-12-07 04:27:37 +08:00
@mineralsalt Java Boy 真的恶心,哪里都有你
|
7
mineralsalt 2021-12-07 08:41:17 +08:00
@JudyHal 你是不是太极端了, 我好像也没说什么吧
|