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

osc*_*avo 8 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
Run Code Online (Sandbox Code Playgroud)

Ran*_*832 6

由于功能实现上的差异而有所不同。由于浮点的性质,两者都不完美。

**运算符在floatobject.c中实现,并包含许多特殊情况,但此处未调用任何特殊情况,因此最终会达到标准C pow函数。该math.pow功能最终做同样的事情。

exp函数是同名C函数的直接包装,由mathmodule.c中的宏定义。

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


基本的问题是math.e,它是您计算其功效的数字,是:

2.718281828459045 09079559829...
Run Code Online (Sandbox Code Playgroud)

e的真正价值是

2.718281828459045 23536028747...
Run Code Online (Sandbox Code Playgroud)

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

  • 我的理解是:什么是 bc? (2认同)

Kev*_*vin 5

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

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