2014-05-20 18 views
12

Co powrócić na numer: print (-2 ** 2)? Według moich obliczeń powinno to być 4, ale interpreter zwraca -4.
Czy to pytanie Pythona, czy moja matematyka jest okropna?Błąd obliczeń z operatorem pow.

+0

Powinieneś zrobić (-2) ** 2 zamiast – sshashank124

+2

'-' ma niższy priorytet niż' ** '. Jest to interpretowane jako - (2 ** 2), nie (-2) ** 2 ... – l4mpi

+1

Głównym powodem tego zamieszania dla większości ludzi jest to, że spodziewają się, że "-2" będzie dosłownym znaczeniem "minus 2", a nie wyrażenie oznaczające "zastosuj operator negacji do literalnego 2 w czasie wykonywania". Kiedy zrozumiesz, że to operator, oczywiste jest, że jest to kwestia priorytetowa; dopóki to nie zrobisz, to jest kłopotliwe. (Dlatego wszystkie osoby, które się na to natkną, są zdezorientowane przez "-2 ** 2", a nie "-x ** 2".) – abarnert

Odpowiedz

22

Zgodnie z docs, ** ma wyższy priorytet niż -, zatem Twój kod jest równoważny -(2 ** 2). Aby uzyskać pożądany wynik można umieścić -2 w nawiasach

>>> (-2) ** 2 
4 

lub użyć wbudowanej pow function

>>> pow(-2, 2) 
4 

lub math.pow funkcji (powrót float wartości)

>>> import math 
>>> math.pow(-2, 2) 
4.0 
5

Operacja ** jest zrobione przed minusem. Aby uzyskać oczekiwane wyniki, należy zrobić

print ((-2) ** 2) 

From the documentation:

Zatem w unparenthesized sekwencji mocy i operatorów jednoargumentowych operatorzy są oceniane od strony prawej do lewej (to nie ogranicza kolejność oceny dla operandów): -1**2 wyniki w -1.

Pełny dokument detail of operators precedence jest również dostępny w dokumentacji. Można zobaczyć ostatni wiersz jest (expr) które zmuszają expr zostać ocenione przed użyciem, stąd wynik (-2) ** 2 = 4

1

można również użyć biblioteki matematycznej ...

math.pow(-2,2) --> 4 
-math.pow(2,2) --> -4 
math.pow(4,0.5) --> 2 
-1

Python ma problem i robi nie widzę -2 jako liczby. Wydaje się, że jest to zgodne z projektem, o czym jest mowa w dokumentach.

-2 interpretuje się jako - (2) {jednoargumentowy minus dodatniej liczby 2}

które zwykle nie daje problem ale -a ** 2 ** ma wyższy priorytet co - a więc z - interpretowane jako uneralne operatoe zamiast części numeru -2 ** 2 oznacza -2 zamiast 2.