Python **(1/2)、math.sqrt和cmath.sqrt之间的差异?
Python **(1/2)、math.sqrt和cmath.sqrt之间的差异?,python,math,square-root,sqrt,Python,Math,Square Root,Sqrt,x**(1/2),math.sqrt()和cmath.sqrt()之间有什么区别 为什么cmath.sqrt()只得到二次右的复数根?我应该用它来表示我的平方根吗?它们在后台做了哪些不同的工作?如果您分别查看cmath和math的文档,您会发现: “提供对复数数学函数的访问” “函数不能与复数一起使用;如果需要对复数的支持,请使用cmath模块中相同名称的函数。” (**)运算符用于pow函数,重要的区别是pow将其参数转换为浮点 因此,对于相同的参数,您可能会看到三个函数的不同结果,如所示。请
x**(1/2)
,math.sqrt()
和cmath.sqrt()
之间有什么区别
为什么
cmath.sqrt()
只得到二次右的复数根?我应该用它来表示我的平方根吗?它们在后台做了哪些不同的工作?如果您分别查看cmath和math的文档,您会发现:
(**)
运算符用于pow
函数,重要的区别是pow
将其参数转换为浮点math.sqrt
返回的值与cmath.sqrt
返回的值的实部之间不会有差异。但是,如果没有真正的解决方案,您将在math.sqrt
中遇到错误
编辑:正如@jermenkoo所指出的,由于
/
操作符的工作方式不同,Python 2和3之间由(**)
返回的值会有所不同。但是,如果直接使用0.5而不是1/2,则不会产生问题。**.5和math.sqrt将几乎相同
**.5将把您从标准C库分派到pow,math.sqrt将把您分派到标准C库中的sqrt,两者的性能应该相似。更大的差异可能是由于
from math import sqrt
sqrt(x)
vs
只是因为在数学模块中查找了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
在这种情况下,**
运算符能够返回复数(注意wierd舍入误差,其中实部应为零)
cmath.sqrt
返回完美的复数值,可能是因为与**
相反,sqrt
是一个专门的平方根计算,而不仅仅是一个floatpow
函数。所有这些努力,而你在链接后面隐藏了有趣的差异3**(1/2)==1
,math.sqrt(3)==1.73205080757
,和cmath.sqrt(3)==(1.73205080757+0j)
。是的,为OP建立一个游乐场,以便他们需要时进行测试to@Teepeemm:第一个取决于/
运算符的行为-在您的情况下,它进行整数除法并计算3**0=1
。在Python 3中,is计算正确的结果,1.732…
。这意味着[c]math.sqrt()
比**0.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
>>> (-4)**0.5
(1.2246467991473532e-16+2j)
import cmath
>>> cmath.sqrt(-4)
2j