domingo, 28 de septiembre de 2008

Modo algebraico y RPN

Autor: Chicho

Para los que usan una HP estas dos formas de usar la calculadora les debe sonar familiar, pero por sea caso daré una simple explicación sobre como funcionan.

El modo algebraico se distingue por mostrar primero el nombre de la funcion y luego la entrada de los parametros, mas o menos como en c++, donde poníamos por ejemplo:

strcpy(nombre,nom) ...(1)

Un ejemplo de este modo en la misma calculadora podría ser, por ejemplo, la funcion "CROSS":

CROSS([2 3 5],[4 1 6]) ...(2)

Donde se efectua el producto vectorial de los dos parametros.

Como podemos ver, el modo algebraico necesita encerrar entre parentesis todas las operaciones que va realizando. Así pues, si desearamos realizar un producto vectorial de un vector con el resultado de otro producto vectorial, tendría la siguiente estructura:

CROSS([5 6 9],CROSS([3 6 1],[5 8 12])) ...(3a)

Y, si desearamos realizar un producto vectorial del resultado de un producto vectorial con otro vector , tendríamos:

CROSS(CROSS([4 7 1],[4 8 3]),[2 8 4]) ...(3b)

Donde ambos son algo fastidiosos para la visión y cuando se trabaja con el código de un programa, dificulta su lectura.

Es ahí donde entra el modo RPN. Este modo (que significa "Notación Polaca Inversa") tiene la ventaja que los parametros no son ingresados dentro de parentesis, sino antes de la función. Como las palabras me quedan cortas, mostraremos el ejemplo (1) en RPN:

nombre
nom
strcpy ...(4)

Como que no queda muy claro lo que hice, así que lo explicaré. Los parametros que nos servirán de entrada son las variables "nombre" y "nom", y la función que les estamos aplicando es "strcpy".

El ejemplo (2) en RPN se vería de esta manera:

[2 3 5]
[4 1 6]
CROSS ...(5)

Lo cual es facil de comprender (por el momento, muajajaj).

Antes de continuar, daré una explicación muy concisa sobre el uso de el modo RPN (antes que me olvide :P). El modo RPN usa como parametros de entrada los ultimos "n" ("n" es el número de parametros que acepta la función) parametros ingresados en la pila ("pantalla" como un aproximación más comprensible) en orden de arriba hacia abajo (osea, si ingresamos 5, luego 2 y finalmente 6, el orden sería 5, 2, 6). Un ejemplo de esto sería:

[2 3 5]
[1 2 4]
[9 8 7]
[7 6 3]
CROSS ...(6)

Sabemos que la funcion CROSS admite dos parametros, de ahí que para aplicar la función se tomen los dos ultimos valores de la pila ordenados de arriba hacia abajo, osea [9 8 7] y [7 6 3]. Esta función nos devolvería el producto vectorial de [9 8 7] y [7 6 3] y lo colocaría al final de la pila, que finalmente quedaría de la siguiente manera:

[2 3 5]
[1 2 4]
[-18 22 -2] ...(7)

Ahora que sabemos eso, podemos poner el ejemplo (3a) en modo RPN. Nos quedará de la siguiente manera:

[5 6 9]
[3 6 1]
[5 8 12]
CROSS
CROSS ...(8a)

También podemos cambiar el ejemplo (3b) a RPN:

[4 7 1]
[4 8 3]
CROSS
[2 8 4]
CROSS ...(8b)

Podemos notar que en modo RPN el código es más legible y, aunque al principio parezca que operar en este modo es más difícil es más dificil ya que no hay paréntesis que nos avisen cuando comienza o termina algo, con la práctica nos aclara mucho las cosas.

Ahí les pongo unos cuantos ejemplos más para que comparen.

1. Queremos sumar 5 y 7:

Modo algebraico:
5 + 7

Modo RPN:
5 7 +

2. Queremos multiplicar 5 por la suma de 4 y 7:

Modo algebraico:
5 * ( 4 + 7 )

Modo RPN:
5 4 7 + *

3. Queremos sumar el producto de 8 y 2 con la división de 9 y 7:

Modo algebráico:
8 * 2 + 9 / 7

Modo RPN:
8 2 * 9 7 / +

Y así podría continuar pero me llego la hora de ir a dormir. Para otra ocación seguiré hablando sobre la HP (dicho sea de paso no tengo XD).

No hay comentarios:

Publicar un comentario