Autor Tema: Funciones matematicas simples pero....  (Leído 1971 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Funciones matematicas simples pero....
« en: 03 de Enero de 2009, 03:00:55 »
Hola amig@s, tengo los siguientes problemas:

Inicialmente necesitaba hacer unos calculos con valores recibidos via rs232, para eso debo pasar ascii a decimal y pense hacerlo de la siguiente manera:

byte_1 -=48;
byte_2 -=48;
byte_3 -=48;
cifra = 0;
cifra = (byte_3 * 100) + (byte_2 *100) + byte_1;


la sorpresa fue de que obtenia valores erroneos con el byte_3, mejor dicho al multiplicar por 100 pero para 10 todo ok, y bueno para no hacerme problemas hice lo siguiente:

cifra = 0
for (veces = 0 ; veces < byte_3; veces++) {cifra+=100;}
cifra += (byte_2 *100) + byte_1;

Lo que desconozco, o lo raro es que la variable cifra para un valor decimal 100 en formato int16 = 100 pero para float = 18565 
miren lo que me da:

int16  float
100   18565
200   18566
300   5767
400   18567
500   31367
600   5768
700   12168
800   18568
900   24968

Y lo que hago es simplemente paso el valor asi: float = int16

Bueno con todo eso, hasta alli caminaba pero avanzando es necesario realice otra operacion y tambien tengo problemas, debo dividir dos valores con resultados en coma flotante y no doy como obtener buenos resultados, nisiquiera logro dividir 10/3 = 3.33

Serán bugs del CCS o mios  :?

Alguna opinion??
« Última modificación: 03 de Enero de 2009, 03:11:15 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Funciones matematicas simples pero....
« Respuesta #1 en: 03 de Enero de 2009, 03:50:11 »
La representación de los float es completamente distinta a la de los enteros, por eso cuando recibas sus bytes e intentes reconstruir el número original deberás tenerlo en cuenta.
Aquí viene explicado: What is the format of floating point numbers?

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funciones matematicas simples pero....
« Respuesta #2 en: 03 de Enero de 2009, 05:16:32 »
Bueno,amigo NOCTURNO tienes razon la composición de formato float es diferente al int y al int16, pero para pasar de un int16 a float hice lo siguiente:

int16 valor1;
float  valor1_a;

valor1_a = valor1/1;


Jeje,asi de simple paso de int16 a float y me saco 10.0000  :)
Ahora puedo seguir con los calculos  :-/ :-/

Saludos.
Edito, hace una aproximacion al valor inicial sólo en 10 sale exacto  :mrgreen:.
« Última modificación: 03 de Enero de 2009, 05:33:33 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Funciones matematicas simples pero....
« Respuesta #3 en: 03 de Enero de 2009, 15:17:31 »
La forma correcta para hacer cast (conversiones de tipo ...) a otros formatos es de la siguiente manera:

int16 valor1;
float  valor1_a;

valor1_a = (float) valor1;


Aunque hay conversiones "obviadas" ... como pasar de un formato menor a uno mayor ... entonces .. es lo mismo si:

int16 valor1;
float  valor1_a;

valor1_a = valor1;


Esto te convertiria sin ningun problema ... De la forma que lo haces, no es conveniente pues introduces una division, si el compilador es tonto introducirá todo el código para hacer divisiones, si está optimizado puede que simplemente elimine la division automáticamente..

Los problemas se dan cuando conviertes un número con signo a otro formato que no soporte signo, como los unsigned int, unsigned char, etc etc .... el error mas comun es pasar de un formato grande a uno pequeño cuando el dato en el número de formato grande es mayor al que soportaria el formato pequeño, ejemplo:

int16 valor1;
float  valor1_a = 80000;

valor1 = (int)valor1_a;


aqui en este caso int16 solo soporta números entre -32768 a 32767.







« Última modificación: 03 de Enero de 2009, 15:30:04 por blackcat »
Control Automático, DSP & Microcontroladores


 

anything