Jakie jest uzasadnienie dla operatora mocy Pythona powiązanego po prawej stronie?

9

Piszę kod do analizy ciągów wyrażeń matematycznych i zauważyłem, że kolejność, w której operatory łańcuchowe są analizowane w Pythonie, różni się od kolejności w Excelu.

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

„Tak więc w niepodzielnej sekwencji mocy i jednoargumentowych operatorów, operatory są oceniane od prawej do lewej (nie ogranicza to kolejności oceny dla argumentów): -1 * 2 daje -1.” *

Oznacza to, że w Pythonie: 2**2**3jest oceniane jako2**(2**3) = 2**8 = 256

W programie Excel działa odwrotnie: 2^2^3jest oceniany jako(2^2)^3 = 4^3 = 64

Teraz muszę wybrać implementację dla własnego parsera. Kolejność programu Excel jest łatwiejsza do wdrożenia, ponieważ odzwierciedla kolejność oceny mnożenia.

Zapytałem kilka osób w biurze, jakie są ich odczucia w ocenie 2^2^3i otrzymałem mieszane odpowiedzi.

Czy ktoś zna jakieś dobre powody lub konsekwencje na rzecz implementacji Pythona? A jeśli nie masz odpowiedzi, prosimy o komentarz z wynikiem, jaki otrzymujesz z jelit - 64lub 256?

Pieter Müller
źródło
Nie jest to trudniejsze do wdrożenia. W każdym razie analizator składni będzie musiał w jakiś sposób obsługiwać odpowiednie skojarzenie w przypadku przypisania.
marco-fiset
Tak, nie jest, właściwie to mam. Ale wróciłem do konwencji Excela, ponieważ jednym z głównych zastosowań mojej biblioteki jest eksportowanie równań do Excela, więc sensowniej jest trzymać się tam, gdzie działają równania.
Pieter Müller,

Odpowiedzi:

10

Powodem, dla którego w matematyce są stosowane wykładniki wykładane z góry na dół, jest inny sposób uzyskania mnożenia wykładników:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
źródło
Twoja odpowiedź nie jest jasna ... ale czy nie tak działają wykładniki w tym kontekście? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Tak to jest. Chodzi mi o to, że z dwóch zamówień, które możesz wybrać, jedno daje coś, co możesz napisać bez układania wykładników. Ciekawe skojarzenie to drugie.
Andrea,
14

Wikipedia (i mój nauczyciel matematyki) mówi mi: Stosy wykładników wykładane są od góry do dołu.

Odzwierciedla to sposób, w jaki Python ocenia to. Microsoft się myli (jeszcze raz)

Ruby ocenia to jako Python, więc jest to bez wątpienia poprawne, ponieważ Matz nie może się mylić.

Thorsten Müller
źródło
4
Zobacz także ten interesujący post dotyczący implementacji operatora w języku D, który obsługuje właściwą asocjatywność.
Pedro Romano
Pamiętam, jak Visual Basic oceniał go w ten sam sposób, ale nie jestem pewien, czy to dodaje wiarygodności tej metodzie. ;)
Xion
Microsoft „myli się” tylko wtedy, gdy nie jest zgodny z pewną specyfikacją, o której twierdzeniu się podąża. Różne języki różnie oceniają operacje matematyczne. APL, jeśli dobrze pamiętam, sprawił, że wszystkie operacje były asocjacyjne. Niespójność z inną specyfikacją jest denerwująca, ale niekoniecznie „zła”.
Keith Thompson