¿Cuál es la justificación para que el operador de potencia de Python se asocie a la derecha?

9

Estoy escribiendo código para analizar cadenas de expresiones matemáticas y noté que el orden en que se evalúan los operadores de potencia encadenados en Python difiere del orden en Excel.

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

"Por lo tanto, en una secuencia sin potencia de operadores de potencia y unarios, los operadores se evalúan de derecha a izquierda (esto no restringe el orden de evaluación para los operandos): -1 * 2 da como resultado -1".

Esto significa que, en Python: 2**2**3se evalúa como2**(2**3) = 2**8 = 256

En Excel, funciona al revés: 2^2^3se evalúa como(2^2)^3 = 4^3 = 64

Ahora tengo que elegir una implementación para mi propio analizador. El orden de Excel es más fácil de implementar, ya que refleja el orden de evaluación de la multiplicación.

Le pregunté a algunas personas en la oficina qué sentían por la evaluación 2^2^3y obtuve respuestas encontradas.

¿Alguien sabe de buenas razones o concideraciones a favor de la implementación de Python? Y si no tiene una respuesta, comente con el resultado que obtiene de la intuición, ¿ 64o 256?

Pieter Müller
fuente
No es mucho más difícil de implementar. De todos modos, su analizador tendrá que soportar la asociatividad correcta de una forma u otra para cosas como la asignación.
marco-fiset
Sí, no lo es, en realidad lo implementé. Pero volví a la convención de Excel, porque uno de los usos principales de mi biblioteca es exportar ecuaciones a Excel, por lo que tiene más sentido atenerse a la forma en que las ecuaciones funcionan allí.
Pieter Müller el

Respuestas:

10

La razón por la cual, en matemática, los exponentes apilados se aplican de arriba hacia abajo es que de la otra manera solo obtienes multiplicación de exponentes:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
fuente
No está claro su respuesta ... pero ¿no es así como funcionan los exponentes en ese contexto? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Sí lo es. Mi punto es que de las dos órdenes que puede elegir, una produce algo que puede escribir sin acumular exponentes. Entonces la asociatividad interesante es la otra.
Andrea
14

Wikipedia (y mi profesor de matemáticas) me dice: los exponentes apilados se aplican de arriba hacia abajo.

Esto se refleja en la forma en que Python lo evalúa. Microsoft está equivocado (una vez más)

Y Ruby lo evalúa como Python, por lo que es correcto sin duda, ya que Matz no puede estar equivocado.

Thorsten Müller
fuente
44
Vea también esta publicación interesante sobre la implementación del lenguaje D del operador que admite la asociatividad correcta.
Pedro Romano
Recuerdo que Visual Basic lo evaluó de la misma manera, pero no estoy seguro de si esto agrega credibilidad a este método. ;)
Xion
Microsoft está "equivocado" solo si no cumple con alguna especificación que dice seguir. Diferentes lenguajes evalúan las operaciones matemáticas de manera diferente. APL, si no recuerdo mal, hizo que todas las operaciones fueran asociativas a la derecha. La inconsistencia con una especificación diferente es molesta, pero no necesariamente "incorrecta".
Keith Thompson el