TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jhefren en 09 de Febrero de 2006, 08:28:00
-
Hola a todo
Hace poco se me prensento la necesidad de poder realizar una
multiplicación de un numero entero con un decimal:
244 * 3,75 = ?
Como hacerlo si los pic no trabajan binarios en decimal.
La solucìon que encontre es sencilla se toma el numero
decimal, se descompone de la siguiente forma:
3,75= 3 + 0,7 + 0,05
y despues que hacer muy facil, se multiplican los enteros
244 * 3 = 732
Ahora les doy una tabla para saber el equivalente de un
decimal a fraccion:
0.1 = 10
0,2 = 5
0,3 = 3,333 redondeamos a 3
0,4 = 2,5 " a 3
0,5 = 2
0,6 = 1,66 redondeamos a 2
0,7 = 1,42 redondeamos a 1
0,8 = 1,25 redondeamos a 1
0,9 = 1,11 redondeamos a 1
0,01 = 100
0,02 = 50
0,03 = 33,33 redondeamos a 33
0,04 = 25
0,05 = 12
0,06 = 16,66 redondeamos a 17
0,07 = 14,2 redondeamos a 14
0,08 = 12,5 redondeamos a 13
0,09 = 11,11 redondeamos a 11
Bueno, estos son los decimales màs importante para realizar
una multiplicaciòn con decimales
ahora se toma el entero a multiplicar y se divide por el
primer decimal, en nuestro caso fue 0,7, el cual equivale
según la tabla a 1:
244/1 = 244
ahora hago lo mismo con el otro decimal, el cual es 0,05
y equivale a 12, entonces:
244/12 = 20,33 redondeamos a 20
el resultado de la multiplicacion sera el siguiente:
244*3 = 732 +
244/1 = 244
244/12 = 20
__________
TOTAL=====> 996
En una calculador normar da: 915 lo cual representa un
error menor al 10 % (creo que de 8,5 %).
en una rutina de programa tendrias que primero
multiplicar los enteros y luego dividir por
cada uno de los decimales y al final se sumara.
Esta se me ocurrio debido a que necesitaba una multiplicacion
con decimales para un pic 16F84.
Espero que les sirva. SI ALGUIEN TIENE UNA FORMA
MÀS SENCILLA. POR FAVOR COLOQUENLA AQUI MISMO.
GRACIAS.
-
Hola jhefren, estuve leyendo tú post y me parece que te has complicado demasiado, supongamos tu cuenta:
244 x 3,75 = 915
Ahora supongamos que para no tener que trabajar con números decimales al 3,75 lo multiplicamos por 100 lo que seria 375
244 x 375 = 91500
Realizamos la multiplicación de la manera común, y luego (ya que multiplicamos por 100) dividimos nuevamente por 100 el resultado.
91500 / 100 =915
De esta forma llegamos al resultado que nos da una calculadora, y sin errores.
Espero te sea de utilidad.
Si necesitaras las rutinas para realizar las divisiones te dejo un link:
http://www.todopic.com.ar/asm/matematicas/
Un saludo, y suerte.
Atte. CARLOS
-
si es verdad charly tienes razon es mas sencilla
te lo agradesco
-
Hola jhefren, no hay nada que agradecer, para aprender y ayudar estamos, esperamos seguir viendo tú participación.
Un saludo, y suerte.
Atte. CARLOS
-
Las rutinas matemáticas son tal vez de las cosas mas complicadas y con las que la gente comete mas errores en el uso de microcontroladores.
Uno debe saber muy de antemano que tipo de valores le ingresará a la rutina de multiplicacion o de división para asegurarse el resultado de si realmente funcionará o no.
Este es un tema muy basto y amplio y para cada caso gralmente se le corresponde una solución diferente.
La solución propuesta por carlos es muy buena pero como dije antes... depende del caso. Si vas a multiplicar 200 por 3.24452E5 entonces estarás en problemas o sería muy lento operar con conversiones todas a decimal. Ni hablar si multiplicas por numeros menores a 0 como 1.5E-6 por citar algun ejemplo.
En estos casos, la generalidad de la conveniencia es la de usar operaciones con coma flotante porque se acomodan con mayor o menor precisión mas o menos a todos estos casos.
También he visto en piclist y en otros lados, rutinas que son muy optimas para calcular la raiz cuadrada, para cuando uno de los multiplicandos es constante, para cuando ambos son coma flotante, etc!
El tema de las operaciones de punto flotante es que son "lentas", si, asi es, hasta tal punto en que se trata de optimizar al máximo la cantidad de multiplicaciones a realizar y se busca de eliminar al máximo toda operacion que sea repetitiva y se la reemplaza por la constante que resulte de eso. Es en estos puntos donde por ejemlpo en software de tiempo real que neceseitan tener cálculos muy rapido, se termina utilizando tablas precalculadas las cuales se leen y luego se "escalan" multiplicandolas por el dato que necesitamos para dar el resultado.
Esas tablas, suelen ser el resultado de varias operaciones anteriores, ya conocidas de antemano y que ayudan a l microcontrolador a realizar sus operaciones velozmente.
Por eso si se quiere generalidad, siempre hay que buscar en las operaciones de coma flotante.
Si se quiere velocidad y generalidad... ver de usar tablas.
Si se quiere velocidad, simplicidad , hay que llevar las multiplicaciones a numeros enteros tal cual lo propuso carlos, pero teniendo en cuenta los márgenes en los cuales los operadores puedan variar.
Saludos
-
ES CIERTO DIOS BENDIGA AL Q INVENTO LAS TABLAS !!!! 
-
El problema de las tablas es que te limitan el rango dinamico de valores que puede tomar una variable, imaginemos que una variable esta determninada por dos octectos con o sin coma flotante, y que a su vez el resultado tambien estara determinado por dos octetos, ya tienes una tabla de 65536 entradas que necesitara 2 octectos por cada entrada, quedando una tabla de 128 kbytes. Ademas esta la incomodidad, aunque fuera posible, de hacer una tabla de tales dimensiones.
Y sin irnos a este caso con el simple hecho de que haya 256 casos el tema de la tabla ya se complica.
A favor se puede decir que los pics aunque pueden hacerlo no estan diseñados ni siquiera con la idea de que tengan que resolver problemas de esta envergadura, de ahi que no se plantee ningun tipo de optimizacion
-
Escrito originalmente por kain589
El problema de las tablas es que te limitan el rango dinamico de valores que puede tomar una variable, imaginemos que una variable esta determninada por dos octectos con o sin coma flotante, y que a su vez el resultado tambien estara determinado por dos octetos, ya tienes una tabla de 65536 entradas que necesitara 2 octectos por cada entrada, quedando una tabla de 128 kbytes. Ademas esta la incomodidad, aunque fuera posible, de hacer una tabla de tales dimensiones.
Y sin irnos a este caso con el simple hecho de que haya 256 casos el tema de la tabla ya se complica.
A favor se puede decir que los pics aunque pueden hacerlo no estan diseñados ni siquiera con la idea de que tengan que resolver problemas de esta envergadura, de ahi que no se plantee ningun tipo de optimizacion
Jeje, creo que si bien es incomodo también se hace y mucho.
Ej. cualquier vehículo que tenga inyección electrónica, tiene tablas de montones de parámetros que en vez de calcularlos, los lee de ahí. Las variables que sensa, le sirven para saber cual posicion dentro de las enormes tablas buscar.
De hecho las memorias de adaptación de los vehículos tienen varios Kbytes...
El uso de tablas es mucho mas generalizado de lo que te imaginas y de ninguna manera se ponen TODOS LOS RESULTADOS POSIBLES. Eso sería tonto, desde el punto de vista técnico. Simplemente se define una precisión se lo hace.
Es como calcular la tabla del coseno. Tenemos 2 opciones o hacemos el calculo por el teorema de Taylor o ponemos 180 valores , uno por cada grado.
Si queremos mas precision entonces agregaremos valores, pero siempre será mas rapido usar tablas que calcular el coseno.
Saludos