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

时间:2015-11-13 02:25:32

标签: python math square-root sqrt

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

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

3 个答案:

答案 0 :(得分:9)

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

  1. cmath"提供对复数数字函数的访问"
  2. math"函数不能与复数一起使用;如果需要支持复数,请使用cmath模块中相同名称的函数。"
  3. (**)运算符mapspow函数,pow将其参数转换为float的重要区别。
  4. 因此,对于相同的参数,您可能会看到不同的结果,如here所示。请注意,如果表达式有一个真实的解决方案,math.sqrt返回的值与cmath.sqrt返回的值的实部之间没有区别。但是,如果没有真正的解决方案,您将收到math.sqrt的错误。

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

答案 1 :(得分:2)

** .5和math.sqrt几乎相同。

** .5将从标准C库pow https://hg.python.org/cpython/file/661195a92131/Objects/floatobject.c#l783发送给你,而math.sqrt会将你发送到标准C库sqrt中的sqrt,两者都是其中应该有类似的表现。

之间的差异可能会导致更大的差异
from math import sqrt
sqrt(x)

VS

import math
math.sqrt(x)

只是因为在数学模块中查找了sqrt

cmath不同,会慢一些。这是复数的数学,这就是为什么它返回复数。请注意,cmath和math之间的差异与cPickle和pickle之类的包不同。

答案 2 :(得分:2)

作为对现有答案的补充,一个值得注意的差异是处理负数时:

>>> 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

sqrt函数仅适用于正值。

>>> (-4)**0.5
(1.2246467991473532e-16+2j)

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

import cmath
>>> cmath.sqrt(-4)
2j

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