Showing posts with label precedencia de operadores. Show all posts
Showing posts with label precedencia de operadores. Show all posts

Friday, September 09, 2022

Sobre la operación 6/2(2+1)


Ya hablé de esto en algún otro artículo, pero la imagen que ilustra esta entrada habla precisamente del tema, en donde más de uno cree que en las reglas de las matemáticas se ha establecido la precedencia de las operaciones. Hay quien incluso indica que hace más de 100 años se pusieron estas reglas y citan un artículo: Discussions: Relating to the Order of Operations in Algebra, de N. J. Lennes, The American Mathematical Monthly, Vol. 24, No. 2 (Feb., 1917), pp. 93-95 (3 pages). Sin embargo, desde el título del mismo podemos ver que es una discusión sobre el orden de las operaciones en álgebra.

La realidad es que estas reglas de precedencia no se necesitan en matemáticas, porque para eso están los paréntesis. Por ejemplo, si pongo: ¿cuánto es 3a / 5b? Si a=5 y b=2, ¿harás primero 3(5), después 5(2) y tendrás 15/10? ¿O harás 3(5)/5(2) de acuerdo a esa convención de hace 100 años? Si es así, 3 * (5/5) * 2? Asumimos que si tenemos una expresión como 3a, haremos de inmediato la multiplicación cuando tengamos el valor de la variable "a", ¿verdad? Pero si escribimos 3 * 5 / 5 * 2 ya no parece tan claro, ¿o me equivoco? Sin embargo, si ponemos (3 * 5) / (5 * 2), sabremos en qué orden tenemos que hacer las operaciones. Vamos, a presencia de los paréntesis cambia la precedencia de las operaciones.

En cómputo, cuando aprendemos un lenguaje, nos indican la precedencia de los operadores para que así, si ponemos la expresión 3a / 5b, sin poner paréntesis, el lenguaje de programación particular que estemos estudiando, hará las operaciones de acuerdo a cómo se ha implementado la precedencia, es decir, qué operador se ejecuta primero, sobre todo cuando el programador no ha cambiado la precedencia usando paréntesis. Pero ojo, la precedencia que defina un lenguaje en particular es arbitraria. No tiene que seguir necesariamente ninguna regla matemática particular. 

Por ello, en la imagen pueden verse dos calculadoras, la de la izquierda es una de las calculadoras Casio y a la derecha es un programa, una app de un teléfono que es una calculadora por software. ¿Por qué los resultados son distintos? Simple: porque cada sistema ha definido la precedencia de operadores de diferente manera. Por ejemplo, la calculadora Casio hace primero la expresión entre paréntesis (2+1) y entonces multiplica por 2 ese valor, lo que le da 6. dividido por 6 da 1. Mientras que la app divide 6 / 2 primero, que le da 3 y entonces hace la operación entre paréntesis y multiplica el resultado anterior, por lo que le da 9. ¿Quién está mal? Nadie. Todo depende de qué precedencia de operadores se use. 

Pero entonces, ¿Cómo hacer para no tener dudas en el resultado de la máquina? Fácil: Por ejemplo, si queremos que el resultado dé 9 y no 1, póngase la expresión 6 / 2 (2 + 1) como (6 / 2) * (2 + 1) y listo. Véase cómo, al poner los paréntesis, le quitamos todo este asunto de la precedencia porque somos nosotros, los que hacemos la operación, que le decimos en qué orden ejecutarla.


Monday, August 12, 2019

Sobre el reto 8/2(2+2)



Los retos aritméticos en Internet, muchas veces a través de las redes sociales, suelen llevar trampa, para que el lector se equivoque y cuando le dicen la razón, entienda el truco. He aquí el más polémico de los que se han publicado.

Hay un nuevo reto aritmético en Internet que pregunta el resultado de la operación 8/2(2+2). Realmente parece fácil pero tiene cierto truco, o al menos eso es lo que pretende que parezca. Veamos cómo resolverlo. En primera instancia, hay unos paréntesis, lo cual significa que debemos hacer la operación dentro del paréntesis primero. En este caso, tenemos (2+2). Fácil, la respuesta es 4. Entonces, lo que tendremos es la expresión 8/2(4). Lo que causa confusión ocurre aquí. ¿Qué debemos hacer primero, 2(4), es decir, multiplicar 2 por 4 o bien, 8/2, es decir, la división de 8 entre 2.

Antes de responder a esto, hay que aclarar que la expresión es ambigua y los lenguajes de programación por ejemplo, definen algo que llaman "precedencia de operadores", de manera que indican cómo la máquina, en el lenguaje de aplicación particular, va a realizar las operaciones. Normalmente primero se hacen multiplicaciones y divisiones y después sumas y retas. Si -como en este caso- las operaciones tienen la misma precedencia, se hacen de izquierda a derecha. Tomando en cuenta eso, entonces tendríamos que hacer 8/2 = 4 y entonces después multiplicar por el 4 que está en el paréntesis, lo que daría como resultado final de 16. Por ejemplo, si ponemos esta operación a Google, sí, el buscador, que tiene integrado una calculadora, éste dará este resultado y además, mostrará la expresión como (8/2) * (2+2).

Pero hay quien dice que hay que hacer primero 2(4), que es 2 por 4, lo cual da 8. Entonces, finalizamos la operación con 8/8 que da como resultado final 1. Y si consideramos la precedencia de operadores, este resultado estaría equivocado pero... ¿lo está? Veamos:

La precedencia de operadores es un invento de los lenguajes de programación, porque en matemáticas podemos cambiar esta precedencia usando paréntesis. Si queremos que una expresión no sea ambigua, como en el caso que nos ocupa, entonces pondremos (8/2) * (2+2) (como precisamente pone Google) o bien, 8 / (2*(2+2)), dependiendo qué queremos expresar. Curiosamente, en matemáticas muchas veces tenemos expresiones como ésta: 8/2c, donde c=4. Y aquí cualquier matemático podría decir: "sustituyo la c por el 4 y multiplico por 2 y entonces hago la división. Y por ende, el resultado final es 1". Y es que si pongo 2c, es claro que es equivalente a 2 por c (que se escribe en lenguaje de las computadoras "2 * c", donde el "*" es el símbolo de multiplicación (para evitar confundirlo con la letra "x"). Entonces, la precedencia "la cambiamos" porque asumimos que 2c es multiplicar "2 * c" primero y luego hacer la división.

El resultado que entrega Google


Cabe decir que en matemáticas no existe la precedencia de operadores y desde que empecé a estudiar aritmética y matemáticas, desde que fui a la escuela, nadie me enseñó qué operación hay que hacer primero. Esto, repito, se inventó para poder definir con precisión las operaciones matemáticas y su orden cuando se escriben expresiones en un lenguaje de programación y sin embargo, en este caso, podrían existir lenguajes de programación que decidieran otra jerarquía o precedencia de operadores por las razones de diseño que consideren. ¿Qué queremos decir con todo esto? Que el lector puede dar la respuesta que quiera, 16 o 1. Ambas son correctas porque la expresión es simplemente ambigua.

Desde luego que esta ambigüedad es lo que provoca la discusión de qué resultado es el correcto. La realidad en matemáticas es que si queremos saber el resultado correcto, hay que poner los paréntesis adecuados para saber en qué orden hay que hacer las operaciones.