Qual è la giustificazione per l'operatore di potenza di Python associato alla destra?


9

Sto scrivendo codice per analizzare stringhe di espressioni matematiche e ho notato che l'ordine in cui gli operatori di potenza incatenati vengono valutati in Python differisce dall'ordine in Excel.

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

"Pertanto, in una sequenza non differenziata di potenza e operatori unari, gli operatori vengono valutati da destra a sinistra (ciò non limita l'ordine di valutazione per gli operandi): -1 * 2 risulta in -1." *

Ciò significa che, in Python: 2**2**3viene valutato come2**(2**3) = 2**8 = 256

In Excel, funziona al contrario: 2^2^3viene valutato come(2^2)^3 = 4^3 = 64

Ora devo scegliere un'implementazione per il mio parser. L'ordine di Excel è più facile da implementare, poiché rispecchia l'ordine di valutazione della moltiplicazione.

Ho chiesto ad alcune persone in ufficio quale fosse il loro istinto per la valutazione 2^2^3e ho ottenuto risposte contrastanti.

Qualcuno è a conoscenza di buoni motivi o concondizioni a favore dell'implementazione di Python? E se non hai una risposta, per favore commenta con il risultato che ottieni da budello - 64o 256?


Non è molto più difficile da implementare. Ad ogni modo, il tuo parser dovrà supportare la giusta associatività in un modo o nell'altro per cose come l'assegnazione.
marco-fiset,

Sì non lo è, l'ho effettivamente implementato. Ma sono tornato alla convenzione di Excel, perché uno degli usi principali della mia libreria è esportare equazioni in Excel, quindi ha più senso attenersi al modo in cui le equazioni funzionano lì.
Pieter Müller,

Risposte:


10

Il motivo per cui in matematica gli esponenti in pila sono applicati dall'alto verso il basso è che nell'altro modo si ottiene semplicemente la moltiplicazione degli esponenti:

(((2^3)^4)^5) = 2^(3 * 4 * 5)

Non è chiaro forma la tua risposta .... ma non è che come esponenti lavorare in questo contesto? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret,

3
Sì. Il mio punto è quello dei due ordini che puoi scegliere, uno produce qualcosa che puoi scrivere senza impilare esponenti. Quindi l'interesse associativo è l'altro.
Andrea,

14

Wikipedia (e il mio insegnante di matematica) mi dice: gli esponenti in pila vengono applicati dall'alto verso il basso.

Ciò si riflette nel modo in cui Python lo valuta. Microsoft ha torto (ancora una volta)

E Ruby lo valuta come Python, quindi è corretto senza dubbio, dal momento che Matz non può sbagliare.


4
Vedi anche questo interessante post sull'implementazione del linguaggio D dell'operatore che supporta la giusta associatività.
Pedro Romano,

Ricordo Visual Basic che lo valutava allo stesso modo, ma non sono sicuro che ciò aggiunga credibilità a questo metodo. ;)
Xion,

Microsoft ha "torto" solo se non è conforme ad alcune specifiche che afferma di seguire. Lingue diverse valutano le operazioni matematiche in modo diverso. APL, se ricordo bene, ha reso tutte le operazioni giuste associative. L'incoerenza con una specifica diversa è fastidiosa, ma non necessariamente "sbagliata".
Keith Thompson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.