【问题标题】:Difference between **(1/2), math.sqrt and cmath.sqrt?**(1/2)、math.sqrt 和 cmath.sqrt 之间的区别?
【发布时间】:2015-11-13 02:25:32
【问题描述】:

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

为什么cmath.sqrt() 单独得到二次右方的复根?我应该专门将它用于我的平方根吗?他们在后台做什么不同?

【问题讨论】:

    标签: python math square-root sqrt


    【解决方案1】:

    如果您分别查看 cmath 和 math 的文档,您会发现:

    1. cmath“提供对复数数学函数的访问”
    2. math "函数不能与复数一起使用;如果您需要对复数的支持,请使用 cmath 模块中的同名函数。"
    3. (**) 运算符 mapspow 函数的重要区别在于 pow 将其参数转换为浮点数。

    因此,对于相同的参数,您可能会看到三个函数的不同结果,如 here 所示。请注意,如果表达式有实数解,则math.sqrt返回的值与cmath.sqrt返回的实数部分没有区别。但是,如果没有真正的解决方案,您将收到 math.sqrt 错误。

    编辑:正如@jermenkoo 指出的那样,由于/ 运算符的工作方式不同,Python 2 和3 之间(**) 返回的值会有所不同。但是,如果您直接使用 0.5 而不是 1/2,则不会导致问题。

    【讨论】:

    • 所有这些努力,你隐藏了链接背后的有趣差异? 3**(1/2)==1math.sqrt(3)==1.73205080757cmath.sqrt(3)==(1.73205080757+0j)
    • 是的,为 OP 设置一个游乐场,以便他们可以测试
    • @Teepeemm:第一个取决于/ 运算符的行为-在您的情况下,它会进行整数除法并计算3**0 = 1。在 Python 3 中计算正确的结果,1.732...
    【解决方案2】:

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

    import math
    math.sqrt(x)
    

    只是因为在数学模块中查找了sqrt

    cmath 不同并且会更慢。它用于复数的数学运算,这就是它返回复数的原因。请注意,cmath 和 math 之间的区别与 cPickle 和 pickle 等软件包不同。

    【讨论】:

      【解决方案3】:

      作为现有答案的补充,一个显着的区别是在处理负数时:

      >>> 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
      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 2017-06-14
      • 2020-04-01
      • 2018-08-19
      相关资源
      最近更新 更多