Sự biện minh cho toán tử năng lượng của Python liên kết với bên phải là gì?


9

Tôi đang viết mã để phân tích các chuỗi biểu thức toán học và nhận thấy rằng thứ tự các toán tử công suất chuỗi được đánh giá trong Python khác với thứ tự trong Excel.

Từ http://docs.python.org/reference/expressions.html :

"Do đó, trong một chuỗi các toán tử công suất và đơn nguyên, các toán tử được ước lượng từ phải sang trái (điều này không ràng buộc thứ tự đánh giá cho các toán hạng): -1 * 2 cho kết quả -1." *

Điều này có nghĩa là, trong Python: 2**2**3được đánh giá là2**(2**3) = 2**8 = 256

Trong Excel, nó hoạt động theo cách khác: 2^2^3được đánh giá là(2^2)^3 = 4^3 = 64

Bây giờ tôi phải chọn một triển khai cho trình phân tích cú pháp của riêng tôi. Thứ tự Excel dễ thực hiện hơn, vì nó phản ánh thứ tự đánh giá của phép nhân.

Tôi đã hỏi một số người xung quanh văn phòng rằng cảm giác ruột của họ là gì để đánh giá 2^2^3và nhận được những phản hồi trái chiều.

Có ai biết bất kỳ lý do chính đáng hoặc sự can thiệp nào có lợi cho việc triển khai Python không? Và nếu bạn không có câu trả lời, vui lòng bình luận với kết quả bạn nhận được từ cảm giác ruột - 64hay 256?


Nó không khó thực hiện hơn nhiều. Dù sao, trình phân tích cú pháp của bạn sẽ phải hỗ trợ tính kết hợp đúng theo cách này hay cách khác cho những việc như phân công.
marco-fiset

Vâng, không, tôi thực sự đã thực hiện nó. Nhưng tôi đã trở lại quy ước Excel, bởi vì một trong những cách sử dụng chính của thư viện của tôi là xuất phương trình sang Excel, do đó, sẽ hợp lý hơn khi tuân theo cách các phương trình hoạt động ở đó.
Pieter Müller

Câu trả lời:


10

Lý do tại sao trong toán học xếp chồng số mũ được áp dụng từ trên xuống là cách khác mà bạn chỉ cần nhân số mũ:

(((2^3)^4)^5) = 2^(3 * 4 * 5)

Đó không phải là hình thức rõ ràng câu trả lời của bạn .... nhưng đó không phải là cách thức số mũ hoạt động trong bối cảnh đó? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret

3
Vâng, đúng vậy. Quan điểm của tôi là trong hai đơn hàng mà bạn có thể chọn, một đơn hàng mang lại thứ gì đó bạn có thể viết mà không cần tích lũy số mũ. Vì vậy, sự kết hợp thú vị là một trong những khác.
Andrea

14

Wikipedia (và giáo viên toán của tôi) nói với tôi: các số mũ xếp chồng được áp dụng từ trên xuống.

Điều này được phản ánh theo cách Python đánh giá nó. Microsoft đã sai (một lần nữa)

Và Ruby đánh giá nó là Python, vì vậy nó không còn nghi ngờ gì nữa, vì Matz không thể sai được.


4
Xem thêm bài viết thú vị này liên quan đến việc triển khai Ngôn ngữ D của nhà điều hành hỗ trợ tính kết hợp đúng.
Pedro Romano

Tôi nhớ lại Visual Basic đánh giá nó theo cùng một cách nhưng tôi không chắc liệu điều này có thêm độ tin cậy cho phương pháp này hay không. ;)
Xion

Microsoft chỉ "sai" nếu không tuân thủ một số đặc điểm kỹ thuật mà hãng tuyên bố tuân theo. Các ngôn ngữ khác nhau đánh giá các hoạt động toán học khác nhau. APL, nếu tôi nhớ lại một cách chính xác, đã thực hiện tất cả các hoạt động liên kết đúng. Sự không nhất quán với một đặc điểm kỹ thuật khác là gây phiền nhiễu, nhưng không nhất thiết là "sai".
Keith Thompson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.