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 2012年

そうではありません。実際に実装しました。ただし、ライブラリの主な用途の1つは数式をExcelにエクスポートすることであるため、Excelの規則に戻しました。そのため、数式がExcelで機能する方法に固執する方が理にかなっています。
PieterMüller12年

回答:


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
はい、そうです。私のポイントは、選択できる2つの次数のうち、1つは指数を積み上げることなく記述できるものを生成するということです。つまり、興味深い関連性はもう1つです。
Andrea

14

ウィキペディア(と私の数学の先生)は私に言う:積み上げ指数は上から下に適用されます。

これは、Pythonによる評価方法に反映されています。マイクロソフトは間違っています(もう一度)

そしてRubyはそれをPythonとして評価しているので、Matzは間違いないので、間違いなく正しいです。


4
正しい結合性をサポートする演算子のD言語実装に関するこの興味深い投稿も参照してください。
Pedro Romano

Visual Basicが同じ方法で評価していることを思い出しますが、これがこのメソッドに信頼性を追加するかどうかはわかりません。;)
Xion

マイクロソフトが「間違っている」のは、従うと主張する仕様に準拠していない場合のみです。言語によって、数学演算の評価は異なります。APLは、私が正しく思い出せば、すべての操作を右に関連付けました。異なる仕様との不整合は厄介ですが、必ずしも「間違っている」とは限りません。
Keith Thompson、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.