Quelle est la justification de l'association de puissance de Python à droite?

9

J'écris du code pour analyser les chaînes d'expression mathématique et j'ai remarqué que l'ordre dans lequel les opérateurs de puissance chaînés sont évalués en Python diffère de l'ordre dans Excel.

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

"Ainsi, dans une séquence sans parenthèse de puissance et d'opérateurs unaires, les opérateurs sont évalués de droite à gauche (cela ne contraint pas l'ordre d'évaluation des opérandes): -1 * 2 donne -1." *

Cela signifie qu'en Python: 2**2**3est évalué comme2**(2**3) = 2**8 = 256

Dans Excel, cela fonctionne dans l'autre sens: 2^2^3est évalué comme(2^2)^3 = 4^3 = 64

Je dois maintenant choisir une implémentation pour mon propre analyseur. L'ordre Excel est plus facile à implémenter, car il reflète l'ordre d'évaluation de la multiplication.

J'ai demandé à certaines personnes dans le bureau ce que leur instinct ressentait pour l'évaluation 2^2^3et j'ai obtenu des réponses mitigées.

Est-ce que quelqu'un connaît de bonnes raisons ou des discussions en faveur de l'implémentation de Python? Et si vous n'avez pas de réponse, veuillez commenter avec le résultat que vous obtenez de l'intestin - 64ou 256?

Pieter Müller
la source
Ce n'est pas beaucoup plus difficile à mettre en œuvre. Quoi qu'il en soit, votre analyseur devra prendre en charge la bonne associativité d'une manière ou d'une autre pour des choses comme l'assignation.
marco-fiset
Ouais ce n'est pas le cas, je l'ai fait implémenter. Mais je suis revenu à la convention Excel, car l'une des principales utilisations de ma bibliothèque est d'exporter des équations vers Excel, il est donc plus logique de s'en tenir à la façon dont les équations y fonctionnent.
Pieter Müller

Réponses:

10

La raison pour laquelle en mathématiques les exposants empilés sont appliqués de haut en bas est que dans l'autre sens, vous obtenez simplement la multiplication des exposants:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
la source
Votre réponse n'est pas claire ... mais n'est-ce pas ainsi que les exposants travaillent dans ce contexte? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Oui, ça l'est. Mon point est que parmi les deux ordres que vous pouvez choisir, l'un donne quelque chose que vous pouvez écrire sans empiler d'exposants. L'associativité intéressante est donc l'autre.
Andrea
14

Wikipedia (et mon professeur de mathématiques) me dit: les exposants empilés sont appliqués de haut en bas.

Cela se reflète dans la façon dont Python l'évalue. Microsoft a tort (encore une fois)

Et Ruby l'évalue comme Python, donc c'est correct sans aucun doute, car Matz ne peut pas se tromper.

thorsten müller
la source
4
Voir également cet article intéressant concernant l'implémentation du langage D de l'opérateur qui prend en charge la bonne associativité.
Pedro Romano
Je me souviens que Visual Basic l'évaluait de la même manière, mais je ne sais pas si cela ajoute de la crédibilité à cette méthode. ;)
Xion
Microsoft n'a «tort» que s'il ne se conforme pas à certaines spécifications qu'il prétend suivre. Différentes langues évaluent différemment les opérations mathématiques. APL, si je me souviens bien, a rendu toutes les opérations associatives à droite. Une incohérence avec une spécification différente est gênante, mais pas nécessairement "fausse".
Keith Thompson