【问题标题】:Basic operations returning complex number返回复数的基本操作
【发布时间】:2020-04-18 11:17:27
【问题描述】:

我在处理基本数学运算时遇到了一个有趣的意外行为,因此我编写了这个简短的、希望是非常解释性的代码。

from collections import namedtuple

P = namedtuple('P', 'x y')

# euclidean distance with missing parentheses before sqroot
dist = lambda p1, p2:(p1.x-p2.x)**2 + (p1.y-p2.y)**2 ** 0.5
# correct_dist = lambda p1, p2: ((p1.x-p2.x)**2 + (p1.y-p2.y)**2)**0.5

A = P(0, 0)
B = P(1, 1)
AB = dist(A, B)

print(AB, type(AB))  # returns complex?!
print(-1**2 -1**2 **0.5)  # -2.0 (as expected since root not applied to the sum)

顺便说一句,这更多是为了理解目的(不是为了实际使用)。
请帮助我更好地理解这一点!

【问题讨论】:

    标签: python python-3.x int operator-overloading complex-numbers


    【解决方案1】:

    你得到一个复数,因为你有一个负数 -1 提高到一个无理数 (2**0.5),你在你的 dist 函数中有:

    (-1)**(2**0.5)
    

    您可以在此处阅读有关将负数提升为小数或无理数的更多信息:

    【讨论】:

      【解决方案2】:

      你漏掉了一些括号。

      (p1.x-p2.x) ** 2 + (p1.y-p2.y) ** 2 ** 0.5
      

      应该是

      ((p1.x-p2.x) ** 2 + (p1.y-p2.y) ** 2) ** 0.5
      

      然后您按预期获得1.4142135623730951(而不是您写的-2)。

      括号是必需的,因为** 的优先级高于+

      【讨论】:

        【解决方案3】:

        这是解释这个结果的操作顺序:

        >>> 2 ** 2 ** 0.5
        2.665144142690225
        >>> 2 ** (2 ** 0.5)
        2.665144142690225
        >>> (2 ** 2) ** 0.5
        2.0
        

        在您的情况下,您会得到 (0 - 1) ** (2 ** 0.5),它会将负数 (-1) 乘以无理数 (sqrt(2)),因此是复数输出。

        我们可以看到:

        >>> (0 - 1) ** (2 ** 0.5)                                                                                                                                      
        (-0.26625534204141565-0.9639025328498773j)
        >>> (-1) ** math.sqrt(2)
        (-0.26625534204141565-0.9639025328498773j)
        

        Python 中的求幂运算符 (**) 从从右到左分组。来自Python Doc (Expressions)

        同一框中的运算符从左到右分组(取幂除外,它从右到左分组)。

        顺便说一句,你的台词:

        print(-1**2 -1**2 **0.5)
        

        产生 -2 因为它等价于:

        print(-(1**2) - (1 ** (2 ** 0.5)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 2015-09-25
          • 1970-01-01
          相关资源
          最近更新 更多