2

我的代码:

import math
import cmath
print "E^ln(-1)", cmath.exp(cmath.log(-1))

它打印的内容:

E^ln(-1) (-1+1.2246467991473532E-16j)

它应该打印什么:

-1

(供参考,谷歌检查我的计算

根据python.org 上的文档 cmath.exp(x)返回 e^(x),并cmath.log(x)返回 ln(x),所以除非我缺少分号或其他东西,否则这是一个非常简单的三行程序。

当我测试cmath.log(-1)它返回 π i(技术上3.141592653589793j)。哪个是对的。欧拉的恒等式表示 e^(π i ) = -1,但 Python 说当我提出 e^(π i ) 时,我得到了某种疯狂的谈话(特别是-1+1.2246467991473532E-16j)。

为什么 Python 讨厌我,我该如何安抚它?

是否有一个图书馆可以让它做正确的数学,或者我必须向范罗森提供牺牲?这可能是某种浮点精度问题吗?

我遇到的最大问题是精度不够,以至于最终函数中的其他值看起来比实际零更接近 0(未显示),因此布尔测试毫无价值(即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 实际上都等于 0,但它们似乎具有最大的虚部,而 4 和 5 根本没有实部。

对不起语气。非常沮丧。

4

3 回答 3

3

正如您已经证明的那样,cmath.log(-1)不完全返回 i*pi. 当然,pi完全返回是不可能的,因为pi它是一个无理数......

现在你提高e了不完全的东西的力量,i*pi你期望得到完全-1的。但是,如果cmath返回,您将得到不正确的结果。(毕竟,exp(i*pi+epsilon)不应该相等-1——欧拉没有提出这个要求!)。

对于它的价值,结果非常接近您的预期——实部是-1虚部接近浮点精度。

于 2013-06-12T18:05:56.680 回答
1

It appears to be a rounding issue. While -1+1.22460635382e-16j is not a correct value, 1.22460635382e-16j is pretty close to zero. I don't know how you could fix this but a quick and dirty way could be rounding the number to a certain number of digits after the dot ( 14 maybe ? ).

Anything less than 10^-15 is normally zero. Computer calculations have a certain error that is often in that range. Floating point representations are representations, not exact values.

于 2013-06-12T18:09:17.337 回答
0

该问题是在有限空间中将无理数(如 π)表示为浮点所固有的。

您可以做的最好的事情是过滤您的结果,如果它的值在给定范围内,则将其设置为零。

>>> tolerance = 1e-15
>>> def clean_complex(c):
...   real,imag = c.real, c.imag
...   if -tolerance < real < tolerance:
...     real = 0
...   if -tolerance < imag < tolerance:
...     imag = 0
...   return complex(real,imag)
... 
>>> clean_complex( cmath.exp(cmath.log(-1)) )
(-1+0j)
于 2013-06-12T18:20:53.893 回答