Qual é a justificativa para o operador de energia do Python associar à direita?

9

Estou escrevendo código para analisar cadeias de expressão matemática e notei que a ordem na qual os operadores de energia encadeados são avaliados no Python difere da ordem no Excel.

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

"Assim, em uma sequência não-parênteses de poder e operadores unários, os operadores são avaliados da direita para a esquerda (isso não restringe a ordem de avaliação dos operandos): -1 * 2 resulta em -1." *

Isso significa que, em Python: 2**2**3é avaliado como2**(2**3) = 2**8 = 256

No Excel, funciona o contrário: 2^2^3é avaliado como(2^2)^3 = 4^3 = 64

Agora tenho que escolher uma implementação para meu próprio analisador. A ordem do Excel é mais fácil de implementar, pois reflete a ordem de avaliação da multiplicação.

Perguntei a algumas pessoas em todo o escritório qual era a sensação delas na avaliação 2^2^3e obtive respostas contraditórias.

Alguém sabe de boas razões ou considerações a favor da implementação do Python? E se você não tem uma resposta, por favor, comente com o resultado que você começa a partir de intuição - 64ou 256?

Pieter Müller
fonte
Não é tão difícil de implementar. De qualquer forma, seu analisador precisará suportar a associatividade correta de uma maneira ou de outra para coisas como atribuição.
marco-Fiset
Sim, não é, eu realmente consegui implementá-lo. Mas voltei à convenção do Excel, porque um dos principais usos da minha biblioteca é exportar equações para o Excel, por isso faz mais sentido manter a maneira como as equações funcionam lá.
Pieter Müller

Respostas:

10

A razão pela qual em matemática os expoentes empilhados se aplica de cima para baixo é que, da outra maneira, você apenas obtém a multiplicação de expoentes:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
fonte
Não está claro de sua resposta .... mas não é assim que os expoentes funcionam nesse contexto? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Sim, ele é. O que quero dizer é que, das duas ordens que você pode escolher, uma produz algo que você pode escrever sem empilhar expoentes. Então a interessante associatividade é a outra.
12138 Andrea Andrea
14

A Wikipedia (e meu professor de matemática) me diz: Os expoentes empilhados são aplicados de cima para baixo.

Isso se reflete na maneira como o Python o avalia. Microsoft está errado (mais uma vez)

E Ruby avalia como Python, por isso está correto sem dúvida, já que Matz não pode estar errado.

thorsten müller
fonte
4
Veja também este post interessante sobre a implementação da linguagem D do operador que suporta a associatividade correta.
Pedro Romano
Lembro-me do Visual Basic avaliá-lo da mesma maneira, mas não tenho certeza se isso adiciona credibilidade a esse método. ;)
Xion
A Microsoft está "errada" apenas se não cumprir algumas especificações que afirma seguir. Linguagens diferentes avaliam operações matemáticas de maneira diferente. A APL, se bem me lembro, tornou todas as operações associativas. Inconsistência com uma especificação diferente é irritante, mas não necessariamente "errada".
21812 Keith Thompson