Яке виправдання для енергооператора 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?


Це не так важче здійснити. У будь-якому випадку, вашому аналізатору доведеться так чи інакше підтримувати правильну асоціативність для таких речей, як присвоєння.
marco-fiset

Так, це не так, я фактично це реалізував. Але я повернувся до конвенції 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
Пуреферрет

3
Так. Моя думка полягає в тому, що з двох замовлень, які ви можете вибрати, один дає щось, що ви можете написати, не складаючи експоненти. Тож цікава асоціативність - інша.
Андреа

14

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

Це відображено в тому, як Python оцінює це. Microsoft помиляється (ще раз)

І Рубі оцінює це як Python, тому це без сумніву правильно, оскільки Матц не може помилитися.


4
Дивіться також цей цікавий пост щодо реалізації мови D оператора, який підтримує правильну асоціативність.
Педро Романо

Я пригадую Visual Basic, оцінюючи це так само, але я не впевнений, чи додає це метод достовірності цьому методу. ;)
Xion

Microsoft "помиляється" лише в тому випадку, якщо вона не дотримується певних специфікацій, до яких вона стверджує, що їх слід дотримуватися. Різні мови оцінюють математичні операції по-різному. APL, якщо я правильно пригадую, зробив усі операції правильно-асоціативними. Невідповідність іншим специфікаціям дратує, але не обов'язково "неправильно".
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.