numpy.exponential 行为略有不同
numpy.exponential slightly different behaviour
我已经在两台不同的机器上安装了 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
在第一 ('server') 台机器和
The exponential of -0.1559828702879514361612223 is 0.8555738459791127903386609
在第二台('local')台机器上。
我知道浮点数没有 25 位小数精度,但这些差异在我的代码中传播并发生在小数点后第 12 位附近。
不同行为的原因可能是什么?
这与 NumPy 无关,而是与系统相关的浮点运算结果有关。在没有 NumPy 的情况下,您可以通过使用 math.exp
来获得相同的结果。一个更简单的例子是
math.exp(2**(-53)) - 1
其中 returns 在我的一台计算机上恰好 0
而在另一台计算机上 2.22e-16
。正如 math.expm1(2**(-53)) = 1.11e-16
的计算所证明的那样,这两者都同样错误(顺便说一句,这就是函数 expm1
存在的原因)。
在某种程度上,CPU-依赖性对你有好处,清楚地表明两个系统之间不同的那些数字是毫无价值的。要关注的是安排计算以减少 loss of significance.
我已经在两台不同的机器上安装了 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
在第一 ('server') 台机器和
The exponential of -0.1559828702879514361612223 is 0.8555738459791127903386609
在第二台('local')台机器上。
我知道浮点数没有 25 位小数精度,但这些差异在我的代码中传播并发生在小数点后第 12 位附近。
不同行为的原因可能是什么?
这与 NumPy 无关,而是与系统相关的浮点运算结果有关。在没有 NumPy 的情况下,您可以通过使用 math.exp
来获得相同的结果。一个更简单的例子是
math.exp(2**(-53)) - 1
其中 returns 在我的一台计算机上恰好 0
而在另一台计算机上 2.22e-16
。正如 math.expm1(2**(-53)) = 1.11e-16
的计算所证明的那样,这两者都同样错误(顺便说一句,这就是函数 expm1
存在的原因)。
在某种程度上,CPU-依赖性对你有好处,清楚地表明两个系统之间不同的那些数字是毫无价值的。要关注的是安排计算以减少 loss of significance.