所以我试图获得e^(pi*I)=-1
,但是python 3给了我另一个奇怪的结果:
print(cmath.exp(cmath.pi * cmath.sqrt(-1)))
结果:
(-1+1.2246467991473532e-16j)
理论上这应该返回-1,不是吗?
答案 0 :(得分:3)
(对已修正问题的部分答案。)
理论上,结果应为-1
,但在实践中该理论略有错误。
cmath
单元使用浮点变量进行计算-一个浮点数表示复数的实数部分,另一个浮点数表示虚数部分。因此,该单元会遇到浮点数学的局限性。有关这些限制的更多信息,请参见规范问题Is floating point math broken?。
简而言之,浮点值通常仅是实际值的近似值。 cmath.pi
的值实际上不是pi,它只是适用于许多计算机浮点单元的最佳近似值。因此,您并不是真正在计算e^(pi*I)
,只是它的近似值。返回的值具有准确正确的实部-1
,这对我来说有些令人惊讶。虚部“应该”为零,但实际结果与零至15个小数位一致,或者与起始值相比超过15个有效数字。这是浮点数通常的精度。
如果您需要确切的答案,则不应使用浮点值。也许您应该尝试一种代数解决方案,例如sympy
模块。
(以下是我的原始答案,该答案适用于先前版本的问题,结果为错误消息。)
错误消息表明您没有输入您认为的内容。您键入了cmath.exp
,而不是表达式外部的math.exp
。指数函数的math
版本期望浮点值。您给它提供了一个复杂的值(cmath.pi * cmath.sqrt(-1)
),因此Python认为您想将该复杂的值转换为float。
当我键入您在问题顶部给出的表达式并正确键入cmath
时,我会得到结果
(-1+1.2246467991473532e-16j)
非常接近-1
的期望值。
答案 1 :(得分:0)
找到了答案。 首先,根据This answer,python 3无法正确计算无理数,因此e ^(pi * I)不会返回-1。 其次,python 3返回任何复数作为笛卡尔对(实数+虚数)。
解决方法是提取数字的实部:
print(cmath.exp(cmath.pi * cmath.sqrt(-1)).real)