**(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 的文档,您会发现:
- cmath "provides access to mathematical functions for complex numbers"
- 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."
-
(**)
运算符 maps 到 pow
函数,重要的区别是 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
函数。
x**(1/2)
、math.sqrt()
和cmath.sqrt()
有什么区别?
为什么 cmath.sqrt()
单独得到二次右的复根?我应该专门将它用于我的平方根吗?他们在后台做了什么不同的事情?
如果您分别查看 cmath 和 math 的文档,您会发现:
- cmath "provides access to mathematical functions for complex numbers"
- 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."
-
(**)
运算符 maps 到pow
函数,重要的区别是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
函数。