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的文档,您会发现:

  • “提供对复数数学函数的访问”
  • “函数不能与复数一起使用;如果需要对复数的支持,请使用cmath模块中相同名称的函数。”
  • (**)
    运算符用于
    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
    是一个专门的平方根计算,而不仅仅是一个float
    pow
    函数。

    所有这些努力,而你在链接后面隐藏了有趣的差异
    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