为什么 np.exp(x) 不等于 np.exp(1)**x

why is np.exp(x) not equal to np.exp(1)**x

为什么 np.exp(x) 不等于 np.exp(1)**x?

例如:

np.exp(400)
>>>5.221469689764144e+173

np.exp(1)**400
>>>5.221469689764033e+173

np.exp(400)-np.exp(1)**400
>>>1.1093513018771065e+160

看起来像是四舍五入的问题。在第一种情况下,它在内部使用非常精确的值 e,而在第二种情况下,您得到的值不太精确,当乘以 400 倍时,精度问题变得更加明显。

使用Windows计算器的实际结果是5.2214696897641439505887630066496e+173,所以你可以看到第一个结果是好的,而第二个不是。

5.2214696897641439505887630066496e+173         // calculator
5.221469689764144e+173                         // exp(400)
5.221469689764033e+173                         // exp(1)**400

从您的结果来看,它似乎使用了一个精度为 15 位的值。

2.7182818284590452353602874713527         // e
2.7182818284590450909589085441968         // 400th root of the 2nd result

这是提高差异的 numpy 优化。

确实,你得懂数学how is calculated the Euler number

e = (1/n)**n n == inf.

我认为 numpy 会按特定顺序停止:

你在numpy exp documentation这里对欧拉数的计算方式不是很清楚

因为这个阶数不等于无穷大,所以两次计算的差异很小。

实际上值 np.exp(400) 是使用以下公式计算的:(1 + 400/n)**n

>>> (1 + 400/n)**n                                                                                                      
5.221642085428121e+173                                                                                                  
>>> numpy.exp(400)                                                                                                      
5.221469689764144e+173

这里有 n = 1000000000000 非常小,将这个差异提高到 10e-5。

欧拉数确实没有确切的数值。像Pi,你只能有一个近似值。