2017-06-07 22 views
4

我已经在两台不同的机器上安装了Python3.6,发行版Anaconda。我不能发誓我使用了相同的安装程序文件,尽管我认为我是这样做的。我看到同样的,当我尝试了Python,巨蟒和numpy的版本: In the server machine In the local machinenumpy.exponential稍有不同的行为

我是越来越小的数值差异。经过一些调试后,我成功地将问题简化为调用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位小数精度,但这些差异在我的代码中传播,发生在小数点后12位左右。

什么可能是不同行为的原因?

+1

对于它的价值,我得到与你的“服务器”相同的输出,同时拥有更新的numpy和更老的python。也许与处理器有关? –

+1

尽量避免将代码作为图片添加进去,因为它使搜索引擎无法使用 –

+0

@IgnacioVergaraKausel Thx。也许你是对的,我认为结果是独立于处理器的,但也许不是。可能出于无知,如果是这种情况,我发现它不安:我更换我的机器,然后我的号码变化?! – zeycus

回答

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

+0

谢谢@alex,你的例子很有启发性。我完全不知道这样的CPU依赖性,但我从现在开始。 – zeycus