2014-05-20 19 views
12

Điều gì sẽ trả về print (-2 ** 2)? Theo tính toán của tôi, nó phải là 4, nhưng thông dịch viên trả về -4.
Điều này của Python hay toán học của tôi là khủng khiếp?Lỗi tính toán với toán tử pow

+0

Bạn nên làm (-2) ** 2 thay vì – sshashank124

+2

'-' có mức ưu tiên thấp hơn' ** '. Điều này được hiểu là - (2 ** 2), chứ không phải (-2) ** 2 ... – l4mpi

+1

Lý do chính làm cho hầu hết mọi người nhầm lẫn là họ mong đợi '-2' là nghĩa đen" âm 2 ", chứ không phải một biểu thức có nghĩa là "áp dụng toán tử phủ định cho chữ 2 ở thời gian chạy". Một khi bạn hiểu rằng đó là một nhà điều hành, thực tế là nó là một vấn đề ưu tiên là hiển nhiên; cho đến khi bạn làm thế, nó rất khó hiểu. (Đó là lý do tại sao tất cả những người chạy vào điều này bị nhầm lẫn bởi '-2 ** 2', không phải' -x ** 2'.) – abarnert

Trả lời

22

Theo docs, ** có mức độ ưu tiên cao hơn -, do đó mã của bạn tương đương với -(2 ** 2). Để có được kết quả mong muốn bạn có thể đặt -2 vào ngoặc

>>> (-2) ** 2 
4 

hoặc sử dụng built-in pow function

>>> pow(-2, 2) 
4 

hoặc math.pow function (trở về float giá trị)

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

Các hoạt động ** là được thực hiện trước dấu trừ. Để kết quả mong đợi, bạn nên làm

print ((-2) ** 2) 

From the documentation:

Như vậy, trong một chuỗi unparenthesized quyền lực và khai thác unary, các nhà khai thác được đánh giá từ phải sang trái (điều này không hạn chế thứ tự đánh giá cho các toán hạng): -1**2 kết quả trong -1.

Đầy đủ detail of operators precedence cũng có sẵn trong tài liệu. Bạn sẽ nhìn thấy dòng cuối cùng là (expr) mà buộc các expr được đánh giá trước khi được sử dụng, do đó kết quả của (-2) ** 2 = 4

1

bạn cũng có thể sử dụng thư viện toán học ...

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

Python có một vấn đề và thực hiện không nhìn thấy -2 dưới dạng số. Điều này có vẻ là do thiết kế như nó được đề cập trong các tài liệu.

-2 được hiểu như là - (2) {trừ unary để số dương 2}

Đó thường không đưa ra một vấn đề nhưng trong -a ** 2 ** có ưu tiên cao hơn như - và do đó với - được hiểu là toán hạng đơn nhất thay vì một phần của số -2 ** 2 ước tính thành -2 thay vì 2.