Apa pembenaran untuk operator daya Python yang menghubungkan ke kanan?

9

Saya menulis kode untuk mengurai string ekspresi matematis, dan memperhatikan bahwa urutan operator daya yang dirantai dievaluasi dalam Python berbeda dari urutan di Excel.

Dari http://docs.python.org/reference/expressions.html :

"Jadi, dalam urutan kekuatan dan operator yang tidak dipersonalisasi, operator dievaluasi dari kanan ke kiri (ini tidak membatasi urutan evaluasi untuk operan): -1 * 2 menghasilkan -1." *

Ini berarti bahwa, dalam Python: 2**2**3dievaluasi sebagai2**(2**3) = 2**8 = 256

Di Excel, ia bekerja sebaliknya: 2^2^3dievaluasi sebagai(2^2)^3 = 4^3 = 64

Saya sekarang harus memilih implementasi untuk parser saya sendiri. Perintah Excel lebih mudah diterapkan, karena mencerminkan urutan evaluasi multiplikasi.

Saya bertanya kepada beberapa orang di kantor apa yang mereka rasakan untuk evaluasi 2^2^3dan mendapat tanggapan beragam.

Adakah yang tahu alasan atau pertimbangan yang mendukung implementasi Python? Dan jika Anda tidak memiliki jawaban, silakan komentari dengan hasil yang Anda dapatkan dari firasat - 64atau 256?

Pieter Müller
sumber
Ini tidak terlalu sulit untuk diterapkan. Bagaimanapun, parser Anda harus mendukung asosiatif yang tepat dalam beberapa cara untuk hal-hal seperti tugas.
marco-fiset
Ya bukan, saya benar-benar menerapkannya. Tapi saya kembali ke konvensi Excel, karena salah satu kegunaan utama perpustakaan saya adalah untuk mengekspor persamaan ke Excel, jadi lebih masuk akal untuk tetap pada cara persamaan bekerja di sana.
Pieter Müller

Jawaban:

10

Alasan mengapa dalam matematika eksponen bertumpuk berlaku dari atas ke bawah adalah cara lain Anda mendapatkan multiplikasi eksponen:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
sumber
Tidak jelas bentuk jawaban Anda .... tetapi bukankah bagaimana eksponen bekerja dalam konteks itu? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Ya itu. Maksud saya adalah bahwa dari dua pesanan yang dapat Anda pilih, satu menghasilkan sesuatu yang dapat Anda tulis tanpa menumpuk eksponen. Jadi asosiatif yang menarik adalah yang lain.
Andrea
14

Wikipedia (dan guru matematika saya) memberi tahu saya: Eksponen yang ditumpuk diterapkan dari atas ke bawah.

Ini tercermin dari cara Python mengevaluasinya. Microsoft salah (sekali lagi)

Dan Ruby mengevaluasinya sebagai Python, jadi itu benar tanpa keraguan, karena Matz tidak mungkin salah.

thorsten müller
sumber
4
Lihat juga posting menarik ini mengenai implementasi Bahasa D operator yang mendukung asosiatifitas yang tepat.
Pedro Romano
Saya ingat Visual Basic mengevaluasinya dengan cara yang sama tetapi saya tidak yakin apakah ini menambah kredibilitas untuk metode ini. ;)
Xion
Microsoft "salah" hanya jika gagal mematuhi beberapa spesifikasi yang diklaim untuk diikuti. Bahasa yang berbeda mengevaluasi operasi matematika secara berbeda. APL, jika saya ingat dengan benar, membuat semua operasi menjadi asosiatif. Inkonsistensi dengan spesifikasi berbeda memang menyebalkan, tetapi belum tentu "salah".
Keith Thompson