x**(1/2)
、math.sqrt()
和cmath.sqrt()
之间有什么区别?
cmath.sqrt()
为什么能够单独获得二次方程的复根?我应该仅使用它来获取平方根吗?它们在后台执行的操作有什么不同?
x**(1/2)
、math.sqrt()
和cmath.sqrt()
之间有什么区别?
cmath.sqrt()
为什么能够单独获得二次方程的复根?我应该仅使用它来获取平方根吗?它们在后台执行的操作有什么不同?
(**)
运算符通过映射到pow函数,重要的区别是pow函数将其参数转换为float类型。math.sqrt
返回值和cmath.sqrt
返回值的实部之间没有区别。但是,如果没有实数解,则math.sqrt
将出现错误。(**)
返回值将有所不同。但是,如果直接使用0.5而不是1/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
函数。
[c]math.sqrt()
而不是**0.5
。 - Walter Tross** .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等包之间的区别不同。
math.sqrt
和i **(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
3**(1/2)==1
,math.sqrt(3)==1.73205080757
,以及cmath.sqrt(3)==(1.73205080757+0j)
。 - Teepeemm/
运算符的行为 - 在您的情况下它执行整数除法并计算出3**0 = 1
。在 Python 3 中,它会计算出正确的结果,1.732...
。 - jermenkoo