【发布时间】:2015-11-13 02:25:32
【问题描述】:
x**(1/2)、math.sqrt() 和 cmath.sqrt() 有什么区别?
为什么cmath.sqrt() 单独得到二次右方的复根?我应该专门将它用于我的平方根吗?他们在后台做什么不同?
【问题讨论】:
标签: python math square-root sqrt
x**(1/2)、math.sqrt() 和 cmath.sqrt() 有什么区别?
为什么cmath.sqrt() 单独得到二次右方的复根?我应该专门将它用于我的平方根吗?他们在后台做什么不同?
【问题讨论】:
标签: python math square-root sqrt
如果您分别查看 cmath 和 math 的文档,您会发现:
(**) 运算符 maps 到 pow 函数的重要区别在于 pow 将其参数转换为浮点数。因此,对于相同的参数,您可能会看到三个函数的不同结果,如 here 所示。请注意,如果表达式有实数解,则math.sqrt返回的值与cmath.sqrt返回的实数部分没有区别。但是,如果没有真正的解决方案,您将收到 math.sqrt 错误。
编辑:正如@jermenkoo 指出的那样,由于/ 运算符的工作方式不同,Python 2 和3 之间(**) 返回的值会有所不同。但是,如果您直接使用 0.5 而不是 1/2,则不会导致问题。
【讨论】:
3**(1/2)==1、math.sqrt(3)==1.73205080757 和 cmath.sqrt(3)==(1.73205080757+0j)。
/ 运算符的行为-在您的情况下,它会进行整数除法并计算3**0 = 1。在 Python 3 中计算正确的结果,1.732...。
** .5 和 math.sqrt 将几乎相同。
** .5 会将您从标准 C 库 powhttps://hg.python.org/cpython/file/661195a92131/Objects/floatobject.c#l783 分派到 pow,然后 math.sqrt 会将您分派到标准 C 库 sqrt 中的 sqrt,两者应该具有相似的性能.更大的差异可能是由两者之间的差异引起的
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)
** 运算符在这种情况下能够返回一个复数(注意奇怪的舍入误差,实部应该为零)
import cmath
>>> cmath.sqrt(-4)
2j
cmath.sqrt 返回完美的复数值可能是因为,与 ** 不同,sqrt 是一个专门的平方根计算,而不仅仅是一个浮点 pow 函数。
【讨论】:
[c]math.sqrt() 优先于**0.5