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

Difference between **(1/2), math.sqrt and cmath.sqrt?

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

为什么 cmath.sqrt() 单独得到二次右的复根?我应该专门将它用于我的平方根吗?他们在后台做了什么不同的事情?

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

  1. cmath "provides access to mathematical functions for complex numbers"
  2. math "functions cannot be used with complex numbers; use the functions of the same name from the cmath module if you require support for complex numbers."
  3. (**) 运算符 mapspow 函数,重要的区别是 pow 将其参数转换为浮点数。

因此,对于相同的参数,您可能会看到三个函数的不同结果,如 here 所示。请注意,如果表达式有实数解,则 math.sqrt 返回的值与 cmath.sqrt 返回值的实部没有区别。但是,如果没有可用的真正解决方案,您将收到 math.sqrt 错误。

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

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

** .5 将派遣您从标准 C 库 powhttps://hg.python.org/cpython/file/661195a92131/Objects/floatobject.c#l783 and math.sqrt will dispatch you to sqrt in the standard C library sqrt 执行 pow,两者应该具有相似的性能。更大的差异可能是由

之间的差异引起的
from math import sqrt
sqrt(x)

import math
math.sqrt(x)

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

cmath 不同,会更慢。它用于复数的数学运算,这就是它返回复数的原因。请注意,cmath 和 math 之间的区别与 cPickle 和 pickle 等包不同。

作为对现有答案的补充,一个显着差异是在处理负数时:

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

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

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

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