2016-04-20 2 views
3

Это что-то странное, что я заметил.Почему `- (num) ** (even_number)` give `- (num^(even_number))` как результат?

Любая конкретная причина, почему -5 ** 2 дает -25 и math.pow (-5,2) дает 25? Ответ должен быть 25. Итак, в чем причина ответа -25?

>>> -5**2 
-25 
>>> -5**4 
-625 
>>> 5**2 
25 
>>> 5**4 
625 
>>> import math 
>>> pow(-5,2) 
25 
>>> pow(-5,4) 
625 
>>> 
+2

Простой ответ: Порядок операций –

+3

Пожалуйста, не размещайте изображения в качестве кода, [См этот мета сообщение] (https://meta.stackoverflow.com/q/ 285551/3933332). –

+0

@BhargavRao - Имейте это в виду. Спасибо. –

ответ

2

documentation для math.pow указывает, что он поднимает x к власти y.

Таким образом, math.pow вычисляет (-5)**4. тогда как просто запись -5**4 эквивалентна -1 * 5 **4, так как по приоритету оператора в Python унарный оператор - имеет меньше приоритета, чем оператор питания **.

1

Это из-за приоритета оператора в python.

Если мы посмотрим на operator precedence, мы видим, что унарный оператор -x имеет более низкий приоритет, чем оператор питания x**y, так что выражение -5**2 означает сначала нанести квадрат на 5, а затем применить отрицательный знак результата , Эта первая операция дает 25, что дает -25.

Выражение math.pow(-5,2) означает квадрат -5. Это эквивалентно (-5)**2.

1

Это связано с тем, что приоритет оператора - ниже, чем оператор питания **. На самом деле ваше выражение будет вычисляться следующим образом:

>>> -(5 ** 2) 

Попробуйте следующую команду, чтобы получить правильный результат:

>>> (-5) ** 2 
25 

Для получения дополнительной информации вы можете прочитать python Operator precedence:

В следующей таблице приведены приоритет оператора в Python, от наименьшего приоритета (наименьшая привязка) до наивысшего приоритета (наиболее привязка).

enter image description here

3

Все это объяснено in the documentation

Оператор мощности связывает более плотно, чем одинарные операторов на его левой; он связывается менее плотно, чем унарные операторы справа.

Таким образом, в несфещенной последовательности степенных и унарных операторов операторы оцениваются справа налево (это не ограничивает порядок оценки для операндов): -1 ** 2 приводит к -1.

4

В Python оператор ** имеет higher precedence, чем оператор -, поэтому ваше выражение 5 ** 2 оценивается первым, то отрицается.Вы можете применить отрицанию сначала с помощью скобок:

>>> -5**2 
-25 
>>> (-5)**2 
25 
Смежные вопросы