Đ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
Trả lời
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
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)
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
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
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.
- 1. Thêm! toán tử và sqrt(), pow() vv cho ứng dụng ví dụ máy tính
- 2. C++ lỗi lớp mẫu với toán tử ==
- 3. Toán tử Arrow so với toán tử Dot
- 4. Lỗi "Thiếu toán hạng sau 'toán tử Bannon' - toán tử 'Bannon' là gì?
- 5. Tạo toán tử `**` cho Scala?
- 6. Tính tương đối trong các toán tử
- 7. Tính toán với COUNT()
- 8. Tính ưu tiên của toán tử Javascript
- 9. Lỗi với bằng toán tử và NSObject trong Swift 2.0?
- 10. toán tử ternary không hoạt động với các hàm lambda
- 11. + = toán tử với Sự kiện
- 12. Tính toán (a^b)% MOD
- 13. Lỗi ưu tiên toán tử PHP?
- 14. RxJava: Cách xử lý lỗi với toán tử nén?
- 15. Lỗi toán tử không mong muốn
- 16. # 1139 - Có lỗi 'toán tử lặp lại toán tử không hợp lệ' từ regexp
- 17. Tôi có thể tính toán pow (10, x) tại thời gian biên dịch trong c?
- 18. STL ít toán tử và lỗi "toán tử không hợp lệ <"
- 19. Toán tử jQuery @?
- 20. Khi nào toán tử `==` không tương đương với toán tử `is`? (Python)
- 21. Chọn Case với toán tử "Is"
- 22. Tạo bản trong Julia với toán tử =
- 23. Lỗi giả lập Windows Azure tính toán
- 24. Thừa kế toán tử()
- 25. Toán tử C++ lambda ==
- 26. C# = toán tử số
- 27. Tôi đang thiếu gì với toán tử ##
- 28. Hiểu toán tử '&'
- 29. toán tử [] = quá tải?
- 30. Loại & toán tử
Bạn nên làm (-2) ** 2 thay vì – sshashank124
'-' 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
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