我的代码:
import math
import cmath
print "E^ln(-1)", cmath.exp(cmath.log(-1))
它打印的内容:
E^ln(-1) (-1+1.2246467991473532E-16j)
它应该打印什么:
-1
(供引用,Google checking my calculation)
根据 the documentation at python.org cmath.exp(x)
返回 e^(x),而 cmath.log(x)
返回 ln (x),所以除非我缺少分号或其他内容,这是一个非常简单的三行程序。
当我测试 cmath.log(-1)
时,它返回 πi(技术上 3.141592653589793j
)。哪个是对的。 Euler's identity说 e^(πi) = -1,但 Python 说当我提高 e^(πi) 时,我得到了一些疯狂的谈话(特别是 -1+1.2246467991473532E-16j
).
为什么 Python 讨厌我,我该如何安抚它?
是否有一个库可以让它正确地进行数学运算,或者我必须向 van Rossum 做出牺牲?这可能是某种浮点精度问题吗?
我遇到的最大问题是精度太低以至于其他值看起来比最终函数(未显示)中的实际零更接近 0,因此 bool 测试毫无值(value)(即 if(x ==0)
) 等是局部最小值,等等...
例如,在下面的迭代中:
X = 2 Y= (-2-1.4708141202500006E-15j)
X = 3 Y= -2.449293598294706E-15j
X = 4 Y= -2.204364238465236E-15j
X = 5 Y= -2.204364238465236E-15j
X = 6 Y= (-2-6.123233995736765E-16j)
X = 7 Y= -2.449293598294706E-15j
3 和 7 实际上都等于零,但它们似乎具有最大的虚部,而 4 和 5 根本没有实部。
抱歉语气。非常沮丧。
最佳答案
正如您已经证明的那样,cmath.log(-1)
不会返回exactly i*pi
。当然,完全返回 pi
是不可能的,因为 pi
是一个无理数...
现在您将 e
提高到不完全是 i*pi
的某次幂,并且您希望得到恰好 -1
。但是,如果 cmath
返回它,您将得到不正确的结果。 (毕竟,exp(i*pi+epsilon)
不应该等于 -1
-- Euler 没有做出这样的声明!)。
就其值(value)而言,结果非常接近您的预期——实部为 -1
,虚部接近浮点精度。
关于Python 认为 Euler 存在身份问题(cmath 返回奇怪的结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072120/