¿Se puede manejar números reales con MCU de 8bits?

#1
Tengo que realizar operaciones matemáticas que dan como resultado números reales y luego presentarlos en un display.
Ejemplo: 125/256 = 0.4882
Si solo uso números enteros, el resultado de la anterior cuenta es cero, lo cual no me sirve.

(Voy a programar en C, el micro es de la familia S08 de Freescale)

Muchas gracias y espero que alguien me pueda ayudar!
 
#2
Podés:

- Usar Nº flotantes -> más código de programa y posiblemente menor velocidad.

- Usar Nº enteros, multiplicando por 10^(n) el numerador previamente y luego dividiendo -> no requiere tanto código, pero si más desarrollo de tu parte (no mucho) y en cuanto a la velocidad, habría que ver si resulta más rápido que el anterior.

En tu caso, para esa cuenta en particular yo haría esto:

PHP:
#define n_decimales 2

int main(){

unsigned long int auxiliar;

....// Tú código

auxiliar=(unsigned long int)(tu_valor*10^(n_decimales)); //Podrías reemplazar la función ^ por un for, si es que tu uC necesita mucho código para eso

auxiliar=(auxiliar>>8); //Desplazas 8 veces a la izq = dividís por 256, en caso de dividir por un Nº distinto a base 2, deberás usar "/" y no el desplazamiento.

...
}
Entonces de ese código el resultado final se encuentra en la variable "auxiliar" y será 48, ese resultado lo tenés que interpretar como 0,48.

Si quisieras más decimales, simplemente lo declarás en el define, ej. 4 => auxiliar=4882 y lo tenés que interpretar como 0,4882.

Acordate que un "long int" son 32 bits y un "unsigned long int" te permite ir de 0 a 2^32, con lo cual en el caso de 125 el n_decimales no deberá superar a 7.
 
#3
Podrías analizar el rango del número (del 125 en tu caso) y multiplicarlo por 10 o 100 antes de dividirlo. Luego, al momento de expresarlo en el display, agregas los "0," correspondientes.

En 8 bits no podes expresar números con coma, solo en los tipo float.
Saludos
 
#5
Podés:

- Usar Nº flotantes -> más código de programa y posiblemente menor velocidad.

- Usar Nº enteros, multiplicando por 10^(n) el numerador previamente y luego dividiendo -> no requiere tanto código, pero si más desarrollo de tu parte (no mucho) y en cuanto a la velocidad, habría que ver si resulta más rápido que el anterior.

En tu caso, para esa cuenta en particular yo haría esto:

PHP:
#define n_decimales 2

int main(){

unsigned long int auxiliar;

....// Tú código

auxiliar=(unsigned long int)(tu_valor*10^(n_decimales)); //Podrías reemplazar la función ^ por un for, si es que tu uC necesita mucho código para eso

auxiliar=(auxiliar>>8); //Desplazas 8 veces a la izq = dividís por 256, en caso de dividir por un Nº distinto a base 2, deberás usar "/" y no el desplazamiento.

...
}
Entonces de ese código el resultado final se encuentra en la variable "auxiliar" y será 48, ese resultado lo tenés que interpretar como 0,48.

Si quisieras más decimales, simplemente lo declarás en el define, ej. 4 => auxiliar=4882 y lo tenés que interpretar como 0,4882.

Acordate que un "long int" son 32 bits y un "unsigned long int" te permite ir de 0 a 2^32, con lo cual en el caso de 125 el n_decimales no deberá superar a 7.
Voy a probar de las 2 maneras, ya que no trabajo con procesos muy rápidos y ver cual me conviene.

Gracias a todos por la ayuda y los consejos!!!
 
#6
Si se pueden manejar.. solo que hay que dividirlos en 4 bloques de 8 bits... para un gran total de 32 bits...

En microchip hay algunas notas de aplicacion de como implementarlos... solo que si es lento, tedioso y requiere mucho tiempo para hacer el calculo... si puedes evitarlo multiplicando por 10, 100 o 1000 es mejor....
 
#7
Si se pueden manejar.. solo que hay que dividirlos en 4 bloques de 8 bits... para un gran total de 32 bits...

En microchip hay algunas notas de aplicacion de como implementarlos... solo que si es lento, tedioso y requiere mucho tiempo para hacer el calculo... si puedes evitarlo multiplicando por 10, 100 o 1000 es mejor....
De todas formas si está trabajando en C, no debería costarle mucho, en asm si debe ser un despelote :D .
 
#8
los pics de 8 bits por lo general no tiene multiplicador nio divisor real en su alu , para multiplicar o dividir tienen quye hacer algoritmos que toman mucho tiempo de procesamiento. no he usado ese micro , pero es de suponer que es igual ya que para numeros reales con punto fltante necestas 32 bits y una ALU que pueda procesarlas directamente..
 
#9
Cuando yo era joven ningún ordenador tenía una unidad de coma flotante pero los ordenadores lo hacían. Es cuestión de implementar el código y ver si es lo bastante rápido.
 
#10
Solo un apunte, desplazar a la izquierda es multiplicar y a la derecha dividir. Lo digo por el codigo comentado de cosmefulanito04, que aunque solo sea un error al comentar puede confundir.
 
Última edición:
Arriba