Каково обоснование для оператора мощности Python, связывающего право?

9

Я пишу код для разбора строк математических выражений и заметил, что порядок, в котором цепочечные операторы вычисляются в Python, отличается от порядка в Excel.

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

«Таким образом, в непереносимой последовательности степенных и унарных операторов операторы оцениваются справа налево (это не ограничивает порядок вычисления для операндов): -1 * 2 приводит к -1». *

Это означает, что в Python: 2**2**3оценивается как2**(2**3) = 2**8 = 256

В Excel это работает наоборот: 2^2^3оценивается как(2^2)^3 = 4^3 = 64

Теперь мне нужно выбрать реализацию для моего собственного парсера. Порядок Excel проще реализовать, поскольку он отражает порядок вычисления умножения.

Я спросил у некоторых людей в офисе, каково их внутреннее чувство для оценки, 2^2^3и получил смешанные ответы.

Кто-нибудь знает какие-либо веские причины или выводы в пользу реализации Python? И если у вас нет ответа, пожалуйста, прокомментируйте результат, который вы получаете от интуиции - 64или 256?

Питер Мюллер
источник
Это не так сложно реализовать. В любом случае, ваш парсер должен будет так или иначе поддерживать правильную ассоциативность для таких вещей, как назначение.
Марко-Фисет
Да, это не так, я действительно реализовал это. Но я вернулся к соглашению Excel, потому что одно из основных применений моей библиотеки - экспорт уравнений в Excel, поэтому имеет больше смысла придерживаться того, как уравнения там работают.
Питер Мюллер

Ответы:

10

Причина, по которой в математике составные показатели применяются сверху вниз, заключается в том, что другой способ просто получить умножение показателей:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
источник
Непонятно из вашего ответа .... но разве так не работают показатели в этом контексте? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Да, это так. Моя точка зрения такова, что из двух порядков, которые вы можете выбрать, один дает то, что вы можете написать без наложения показателей. Так что интересная ассоциативность другая.
Андреа
14

Википедия (и мой учитель математики) говорит мне: составленные экспоненты применяются сверху вниз.

Это отражено в том, как Python оценивает его. Microsoft ошибается (еще раз)

А Ruby оценивает его как Python, так что это, без сомнения, правильно, поскольку Мац не может ошибаться.

Торстен Мюллер
источник
4
Смотрите также этот интересный пост о реализации оператора на языке D, который поддерживает правильную ассоциативность.
Педро Романо
Я вспоминаю Visual Basic, оценивая его таким же образом, но я не уверен, добавляет ли это доверия к этому методу. ;)
Xion
Microsoft «ошибается» только в том случае, если она не соответствует какой-либо спецификации, которой, по ее утверждению, следует следовать. Разные языки по-разному оценивают математические операции. APL, если я правильно помню, сделал все операции правоассоциативными. Несоответствие с другой спецификацией раздражает, но не обязательно «неправильно».
Кит Томпсон