我在两台不同的机器上安装了Python3.6,分发Anaconda。我不能发誓我使用相同的安装程序文件,虽然我认为我做到了。当我尝试检查Python,Anaconda和numpy版本时,我看到了同样的情况:
我的数字差异很小。经过一些调试后,我成功地将问题减少到numpy.exp的调用。只需运行代码
import numpy as np
x = -0.1559828702879514361612223
y = np.exp(x)
print("The exponential of %0.25f is %0.25f" % (x, y))
我得到了
The exponential of -0.1559828702879514361612223 is 0.8555738459791129013609634
在第一台('服务器')机器和
The exponential of -0.1559828702879514361612223 is 0.8555738459791127903386609
在第二台('本地')机器中。
我知道浮点数没有25位小数精度,但这些差异在我的代码中传播并发生在十二进制小数点附近。
不同行为可能是什么原因?
答案 0 :(得分:1)
这不是关于NumPy的,而是关于浮点运算的结果与系统有关。如果没有NumPy,您可以使用math.exp
获得相同的结果。一个更简单的例子是
math.exp(2**(-53)) - 1
在我的一台计算机上准确返回0
,在另一台计算机上返回2.22e-16
。这两个都与math.expm1(2**(-53)) = 1.11e-16
的计算证明同样错误(顺便说一下,这就是函数expm1
存在的原因)。
在某种程度上,CPU依赖性对你有好处,清楚地表明两个系统之间不同的数字是没有价值的。要关注的是安排计算以减少loss of significance。