**(1/2),math.sqrt和cmath.sqrt之间的区别?

Aar*_*tor 7 python math sqrt square-root

有什么区别x**(1/2),math.sqrt()cmath.sqrt()

为什么cmath.sqrt()单独得到二次方的复杂根?我应该专门用于我的平方根吗?他们在背景中的做法有何不同?

shr*_*t18 9

如果你分别查看cmath和math的文档,你会发现:

  1. cmath "提供对复数的数学函数的访问"
  2. math "函数不能与复数一起使用;如果需要支持复数,请使用cmath模块中相同名称的函数."
  3. (**)操作映射pow功能,与最重要的区别pow转换它的参数浮动.

因此,你可能会看到不同的结果与相同参数的三种功能,这表现在这里.请注意,如果表达式有一个真正的解决方案,返回的值与返回的值math.sqrt的实部之间没有区别cmath.sqrt.但是,math.sqrt如果没有可用的实际解决方案,您将收到错误.

编辑:正如@jermenkoo指出的那样,(**)由于/操作符的工作方式不同,Python 2和3之间返回的值会有所不同.但是,如果直接使用0.5而不是1/2,那不应该导致问题.

  • @Teepeemm:第一个取决于`/`运算符的行为 - 在你的情况下它执行整数除法并计算`3**0 = 1`.在Python 3中计算正确的结果,`1.732 ...`. (3认同)
  • 所有这些努力,你隐藏了链接背后有趣的差异?`3**(1/2)==1`、`math.sqrt(3)==1.73205080757`和`cmath.sqrt(3)==(1.73205080757+0j)`。 (2认同)

Jea*_*bre 5

作为现有答案的补充,一个显着的区别是处理负数时:

>>> import math
>>> math.sqrt(-4)
Traceback (most recent call last):
  File "<string>", line 301, in runcode
  File "<interactive input>", line 1, in <module>
ValueError: math domain error
Run Code Online (Sandbox Code Playgroud)

sqrt函数仅适用于正值。

>>> (-4)**0.5
(1.2246467991473532e-16+2j)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运算**符能够返回一个复数(注意实部应为零的奇怪舍入错误)

import cmath
>>> cmath.sqrt(-4)
2j
Run Code Online (Sandbox Code Playgroud)

cmath.sqrt返回完美的复数值可能是因为,与 相反**sqrt是专门的平方根计算,而不仅仅是浮点pow函数。