Python 认为 Euler 存在身份问题(cmath 返回奇怪的结果)

标签 python floating-point cmath

我的代码:

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/

相关文章:

python - 将相同的 tkinter 跟踪方法绑定(bind)到多个 tk 变量

C++ 帮助从字符串中设置 setf floatfield

c++ - visual c++ std::isfinite() 是否符合标准?

c++ - 在哪里可以找到标准的C++ 17 cmath文件?

python - 密码更改后 Azure ChainedTokenCredential 失败

python - 如何获取域名后面的url路径

轴 ('square' ) 和 set_xlim 之间的 python 相互作用

c - 递增 float 的有效位数

javascript - 用JavaScript添加一堆 float ,总和的错误是什么?

c++ - cmath std::pow 函数在分配给变量时给出错误的值?