math.exp(2) 和 math.e**2 之间的区别

Difference between math.exp(2) and math.e**2

在编程时我注意到 math.exp(2) 和 math.e**2 的结果不同。如下所示,计算 e^1 时不会出现这种差异。

不是经验丰富的程序员,我想知道为什么会有所不同? 我认为这与四舍五入有关。 python 文档说 math.exp(x) return e**x,但这似乎并不完全正确。那么 math.exp(x) 操作与 math.e**x 有何不同呢?

>>> math.exp(1)
2.718281828459045
>>> math.e**1
2.718281828459045
>>> math.exp(1)==math.e**1
True
>>> math.exp(2)
7.38905609893065
>>> math.e**2
7.3890560989306495
>>> math.exp(2)==math.e**2
False
>>> math.exp(100)
2.6881171418161356e+43
>>> math.e**100
2.6881171418161212e+43
>>> math.exp(100)==math.e**100
False

exp(x) 的实现级别比 e**x 低得多。它本质上是 libc 中函数的包装器。所述函数可能(在某种程度上)使用 Taylor series 扩展来直接计算值(或者可能是其他一些数学方法,我不确定)。

另一方面,e**x 正在取一个数的幂。这是一种完全不同的策略,在大多数情况下可能不够精确。提高数字的幂很难精确做到。

因功能实现的不同而不同。由于浮点的性质,两者都不是完美的。

** 运算符在 floatobject.c and contains a lot of special cases, but none of them are invoked here, so it ultimately reaches the standard C pow function. The math.pow 函数中实现,最终做同样的事情。

exp 函数是同名 C 函数的简单包装,在 mathmodule.c.

中用宏定义

正好exp更精确(两个结果都匹配,在浮点数允许的精度范围内,我在bc中计算的高精度答案)。很可能是因为在 pow 内部,它正在计算您作为第一个参数传递的双精度 e 值的扩展精度对数,该值略小于 1.


根本问题是 math.e,即您要计算其幂的数字,是:

2.718281828459045 09079559829...

e 的实际值是

2.718281828459045 23536028747...

当您使用 pow** 时,此错误会更加复杂,而如果您使用 [=14=,则可能不会(或可能在内部使用更高精度的值) ] 由于它使用的算法的细节。