Каково обоснование для оператора мощности 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)

Непонятно из вашего ответа .... но разве так не работают показатели в этом контексте? ((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, если я правильно помню, сделал все операции правоассоциативными. Несоответствие с другой спецификацией раздражает, но не обязательно «неправильно».
— Кит Томпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.