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)
由于功能实现上的差异而有所不同。由于浮点的性质,两者都不完美。
该**运算符在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由于使用的算法的详细信息,如果您正在使用,则可能不会(或者可能在内部使用更高的精度值)。
| 归档时间: |
|
| 查看次数: |
4900 次 |
| 最近记录: |