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!