TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: rivale en 22 de Junio de 2011, 22:28:08
-
Hola, quisiera saber como realizar una multiplicacion entre numeros decimales de punto fijo (Q15) con algun numero entreo normal. por ejemplo ;
x1=Q15(0.000123);
x2=4094;
res=x1*x2;
se que si multiplico 2 Q15 el resultado es en el mismo formato, pero como haria la operacion de arriba
-
Lo mas sencillo es que intentes realizar la operacion utilizando numeros Q16, estos pueden manejar enteros y fraccionales.
saludos!!
-
Lo mas sencillo es que intentes realizar la operacion utilizando numeros Q16, estos pueden manejar enteros y fraccionales.
saludos!!
gracias por la idea
no se me habia ocurrido, pero entonces mi resultado seria del tipo "long"? o me equivoco, como lo pasaria despues a un entero de 16bits?
-
si el resultado es fraccional, es simple, solamente tomas los 16 bits menos significativos y les das un corrimiento a la deracha (por el bit de signo). De lo contrario hay que escalar el resultado para que te dé un numero entre -1 y 1 y posteriormente tomas los digitos menos significativos. Otra opcion es que si puedes prescindir de la parte fraccional, es tomar los 16 bits mas significativos y ponerlos en una variable int.
Finalmenta la ultima opcion es pasar la cifra a flotante.
espero te sirva de algo
saludos
-
gracias por la ayuda Fram, entonces los manejaria como enteros "long" y mi parte entera serian los bits del 16-31, y mis decimales serian del 0-15., lo que no entendi muy bien es como manejar el signo de mis numeros fraccionales
lo que me intereza es realizar operaciones entre fraccionales y enteros, pero al final solo usaria el numero entero.
de antemano gracias
-
en eso caso es mas simple:
suponque multiplicas 10 por 0.5 utilizando q16, entonces tendrias:
0x000A0000 (10) * 0x00008000 =0x000050000
los 16 bits mas significaticos serian tu parte real (0005), y el bit de signo ya viene integrado, en el caso de que quisieras la parte fraccional seria un poco mas complejo.
entonces suponte que tienes una variable de tipo int llamada resultado_entero que es donde quieres la parte entera y otra que se llama resultado_fraccional que es tu variable de tipo long que parte entera y fraccional, simplemente harias lo siguiente:
resultado_entero=(resultado_fraccional)>>16;
y ais ya tienes la parte entera de la multiplicacion.
espero te sea de utilidad
saludos!!
-
ha, ok, entonces solo realizaria las multimplicaiones normalmente, siempre considerando que en los bits menos significativos tendria mi parte fraccional y en los msb mi parte entera.
muchas gracias por la explicacion