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

时间:2015-06-10 12:54:14

标签: python math exponent

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

不是一位经验丰富的程序员,我想知道为什么这会有所不同? 我认为它与四舍五入有关。 python文档说math.exp(x)返回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

2 个答案:

答案 0 :(得分:5)

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

另一方面,e**x正在取一个数字并将其提升为一个幂。这是一种完全不同的策略,在大多数情况下可能不太精确。将数字提升到权力很难准确。

答案 1 :(得分:5)

由于功能的实现存在差异,因此不同。由于浮点的性质,两者都不完美。

**运算符在floatobject.c中实现,包含许多特殊情况,但这里没有调用它们,因此最终达到标准C pow函数。 math.pow函数最终会做同样的事情。

exp函数是一个简单的包装同名C函数的包装器,用mathmodule.c中的宏定义。

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

根本问题是math.e,即你计算权力的数字是:

2.718281828459045 09079559829...

e 的实际价值是

2.718281828459045 23536028747...

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