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

12

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

cmath.sqrt()为什么能够单独获得二次方程的复根?我应该仅使用它来获取平方根吗?它们在后台执行的操作有什么不同?

4个回答

16
如果您查看cmath和math的文档,您会发现:
  1. cmath "提供了复数的数学函数"
  2. math "这些函数不能用于复数;如果需要支持复数,请使用cmath模块中同名的函数。"
  3. (**) 运算符通过映射到pow函数,重要的区别是pow函数将其参数转换为float类型。
因此,对于相同的参数,您可能会看到三个函数的不同结果,如此处所示。请注意,如果表达式具有实数解,则math.sqrt返回值和cmath.sqrt返回值的实部之间没有区别。但是,如果没有实数解,则math.sqrt将出现错误。
编辑:正如@jermenkoo指出的,由于“/”运算符的工作方式不同,在Python 2和3之间(**)返回值将有所不同。但是,如果直接使用0.5而不是1/2,则不应该出现问题。

2
那么多努力,结果你把有趣的差异都隐藏在一个链接后面了吗?3**(1/2)==1math.sqrt(3)==1.73205080757,以及cmath.sqrt(3)==(1.73205080757+0j) - Teepeemm
是的,为了让OP测试,我们需要设置一个游乐场。 - shree.pat18
3
第一个问题取决于 / 运算符的行为 - 在您的情况下它执行整数除法并计算出 3**0 = 1。在 Python 3 中,它会计算出正确的结果,1.732... - jermenkoo

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

sqrt函数只能用于正数。

>>> (-4)**0.5
(1.2246467991473532e-16+2j)
** 操作符能够在某些情况下返回一个复数(注意实部应该为零的奇怪舍入误差)。
import cmath
>>> cmath.sqrt(-4)
2j

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


这意味着在编程中,应该优先使用[c]math.sqrt()而不是**0.5 - Walter Tross

3

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

vs

import math
math.sqrt(x)

因为在math模块中查找sqrt,所以会出现这种情况。

cmath不同,速度会更慢。它用于对复数进行数学运算,因此返回的是复数。需要注意的是,cmath和math之间的区别与cPickle和pickle等包之间的区别不同。


0
除了其他答案之外,从性能的角度来看,我认为math.sqrti **(1/2)大致相同。
>>> import timeit
>>> import math
>>> 
>>> timeit.timeit(stmt=lambda: [i**(1/2) for i in range(100000)], number=100)
1.5627256259995193
>>> timeit.timeit(stmt=lambda: [math.sqrt(i) for i in range(100000)], number=100)
1.556340146000366
>>> 

但是cmath.sqrt比它们稍微慢一点:

>>> import cmath
>>> timeit.timeit(stmt=lambda: [cmath.sqrt(i) for i in range(100000)], number=100)
1.9145739509986015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接