编程时我发现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
答案 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
,则可能不会(或者可能在内部使用更高的精度值)关于它使用的算法的细节。