Python 3复杂的数学错误答案

时间:2019-03-07 22:49:04

标签: python-3.x math cmath

所以我试图获得e^(pi*I)=-1,但是python 3给了我另一个奇怪的结果: print(cmath.exp(cmath.pi * cmath.sqrt(-1))) 结果:

(-1+1.2246467991473532e-16j)

理论上这应该返回-1,不是吗?

2 个答案:

答案 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)