Basi c операции, возвращающие комплексное число - PullRequest
1 голос
/ 18 апреля 2020

Я написал этот короткий и, надеюсь, довольно объяснительный код, поскольку столкнулся с интересным неожиданным поведением при работе с базовыми c математическими операциями.

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)

Кстати, это больше для понимания целей ( не для фактического использования).
Помогите мне лучше понять это, пожалуйста!

Ответы [ 3 ]

0 голосов
/ 18 апреля 2020

Этот порядок действий объясняет этот результат:

>>> 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 (**) группах от справа налево . From Python Do c (Выражения) :

Операторы в одной группе блоков слева направо (кроме возведения в степень, которая группируется справа налево).

Кстати, ваша строка:

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

выдает -2, потому что это эквивалентно:

print(-(1**2) - (1 ** (2 ** 0.5)))
0 голосов
/ 18 апреля 2020

вы получаете комплексное число, потому что у вас есть отрицательное число -1, возведенное в иррациональное число (2**0.5), в вашей функции dist:

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

вы можете прочитать больше о возведении отрицательных чисел в дробные или иррациональные числа здесь:

0 голосов
/ 18 апреля 2020

Вы пропустили некоторые скобки.

(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, как вы написали).

Скобки необходимы, потому что ** имеет более высокий приоритет, чем +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...