Autor Tema: Problemas de resolucion con datos tipo float...  (Leído 5262 veces)

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

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Problemas de resolucion con datos tipo float...
« en: 18 de Septiembre de 2009, 17:27:14 »
Hola! Aca de nuevo posteando! Me enfrento a un nuevo problema y la verdad es que no se para que lado disparar. Me pasa lo siguiente, usando el codigo que muestro mas abajo para calcular la distancia entre dos puntos dadas las coordenadas (desde un gps), me encuentro con que anda muy bien cuando se trata de distancias grandes, pero cuando hablamos de distancias del orden de los metros (es decir, cuando necesitamos trabajar con mas decimales), el codigo no responde bien. He observado por ejemplo haciendo los calculos en forma paralela, que los valores que da este codigo simulado en MPLAB y compilado con HI TECH, son correctos... pero solo hasta el cuarto decimal. Si no, otra de las cosas que veo, por ej, es que si declaro el valor de PI como "#define pi       3.141592" y despues levanto ese valor a una variable tipo float como para ver que toma haciendo por ej, "var=pi" , encuentro que var=3.14160156  Shocked aca no mantuvo ni hasta el cuarto decimal!!!. Probe de usar variables tipo double sin mayor exito... volvi a float xq veo que esta abarca mas decimales... igual no estoy muy seguro de con que tipos de datos deberia operar para operaciones que abarquen un buen numero de decimales ( >4!!)
El gran problema, es que necesito llegar un poco mas alla del cuarto decimal para que el codigo sea efectivo para calcular distancias pequeñas. De mas esta decir que el algoritmo de calculo lo tengo super testeado en matlab y anda muy bien, inclusive para cortas distancias.

void calc_dist(void)
{
   
   float lat1,lat2,lon1,lon2,aux;
   float dist=0;
   


lat1=(float)deg2rad(fLatitudAnterior); //todas las variables en juego son del tipo float 24bits tipo IEEE Modified 24-bit
lat2=(float)deg2rad(fLatitud);
lon1=(float)deg2rad(fLongitudAnterior);
lon2=(float)deg2rad(fLongitud);

dist=(float)sin((float)lat1) * (float)sin(lat2);
aux = (float)cos((float)lat1) *(float) cos(lat2);
aux =(float) aux* (float)cos((float)lon1 - (float)lon2);
dist=(float)dist +(float)aux;
if(dist>1)                                  //Agruegue esto xq para distancias muy chicas, me
   {                                     //da valores por ej 1,00000456 y en el prox calculo, acos(dist)--> daria infinito
      dist=1;
   }
dist=acos(dist);
dist=(float)dist*6373;



   fDistanciaTotal=(float)fDistanciaTotal+(float)dist;
}

float deg2rad(float dd)
{
   return ((float)dd*(float)3.1415926/(float)180) ;
}


Cualquier ayuda que me puedan brindar, estoy mas que agradecido!!

PD.: Por error publique este mismo post en la seccion  " Lenguaje C para PC y sus variantes ", pediria porfavor que eliminen el otro post para evitar problemas!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problemas de resolucion con datos tipo float...
« Respuesta #1 en: 18 de Septiembre de 2009, 18:21:12 »
Ese problema es inherente a la resolución de los float. La solución sería usar double que da más resolución pero como comentas... tu compilador no maneja los double.

CCS maneja floats de 32 bits y por lo que leo en tu código, Hitech es de 24, talvez te convenga más usar CCS.

http://www.todopic.com.ar/foros/imgtiny/2jdm9vm.png

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas de resolucion con datos tipo float...
« Respuesta #2 en: 18 de Septiembre de 2009, 20:42:11 »
Gracias por la pronta respuesta migsantiago! A esta altura del proyecto, se me torna muy complicado cambiarme a ccs porque ya tengo todo hecho en HI TECH. Por otro lado, segun el manual de HI TECH dice que si maneja variables de 32 bits

Floating-point formats
Format                          Sign biased exponent mantissa
IEEE 754 32-bit               x  xxxx xxxx xxx xxxx xxxx xxxx xxxx xxxx
modified IEEE 754 24-bit  x xxxx xxxx xxx xxxx xxxx xxxx


... he vuelto a probar de cargar pi a una variable tipo double, y ahora por lo menos me encuentro con que este adpta 3.141593 (siendo el valor que me gustaria que entre 3.14159265358979323846 jeje)
Hasta cuantos decimales se supone que podria tomar una variable de 32 bits de punto flotante? 7 y 8 como dice en el cuadro que me pasaste?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problemas de resolucion con datos tipo float...
« Respuesta #3 en: 18 de Septiembre de 2009, 21:54:44 »
No sé, pero si haces una búsqueda en Google sobre el estándar IEEE seguro que encuentras la respuesta.

El formato float de CCS es el float de Microchip... diferente al IEEE. En el foro hay detalles al respecto por si te interesa seguir comparándolos.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problemas de resolucion con datos tipo float...
« Respuesta #4 en: 19 de Septiembre de 2009, 15:20:21 »
según recuerdo el ccs te da hasta 7 digitos después de la coma.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Problemas de resolucion con datos tipo float...
« Respuesta #5 en: 20 de Septiembre de 2009, 11:50:42 »
Ok! Gracias por los aportes! Les cuento que al final probe con una funcion parecida pero que reemplaza los senos por cosenos, cambie los numeros a doubles y anduvo! El problema de que los doubles parecian tener menos digitos que los floats se fue cuando en el programa cambie los numeros enteros involucrados en una operacion con floats (180 por ej) por 180.0. Ahora la funcion da valores razonables!
Gracias de nuevo por las pilas que le ponen!!

Desconectado lasv

  • PIC10
  • *
  • Mensajes: 6
Re: Problemas de resolucion con datos tipo float...
« Respuesta #6 en: 27 de Junio de 2011, 13:47:09 »
hola richard que tal! sabes que tengo el mismo problema trabajando con CCS! tbn estoy trabajando con coordenadas y necesito calcular las distancias! pero el problema es que el programa solo me muestra 2 decimales.. como puedo hacer para incrementar estos valores de decimales? gracias..

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas de resolucion con datos tipo float...
« Respuesta #7 en: 27 de Junio de 2011, 17:24:58 »
Cuando se trabaja con los datos que entrega un GPS y las distancias a obtener son menores a 2000m no conviene utilizar las ecuaciones con sin y cos que se encuentran en la red, sino utilizar alguna aproximación...


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Electro_Team

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas de resolucion con datos tipo float...
« Respuesta #8 en: 29 de Junio de 2011, 17:18:28 »
Hola Richar. Saludos. Tengo un problema parecido al tuyo, pero en mi caso estoy es calculando las coordenadas azimutales. Todas mis variables las uso en double, y tengo una operacion de resta y me da bien el resultado, pero al multiplicar ese resultado por un entero, no me da el valor que deberia ser. Intente usando variables float32 pero me da el mismo error de calculo. Espero puedas ayudarme. Gracias 

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Problemas de resolucion con datos tipo float...
« Respuesta #9 en: 29 de Junio de 2011, 17:33:40 »
Se fijaron por aca?
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia


 

anything