I'm trying to calculate the distance between two sets of coordinates, one set coming from a GPS module. I'm using the Haversine formula, which produces the correct answer when I enter it directly into Wolfram Alpha. I'm also using the TinyGPS library. Unfortunately, my code on the Arduino Duemilanove is not producing the correct answer, and I can't figure out why.
float flat, flon;
{
gps.f_get_position(&flat, &flon);
long dest_latitude = xx.xxxxxxxx;
long dest_longitude = -yy.yyyyyyyy;
int radius = 3956.6;
const float two = 2.0;
float delta_lat = radians(dest_latitude - flat);
float delta_lon = radians(dest_longitude - flon);
float a = square(sin(delta_lat/two)) + cos(radians (flat)) * cos(radians (dest_latitude)) * square(sin(delta_lon/two));
float c = two * asin(sqrt(a));
float d = radius * c;
(it goes on from here)
When I'm approximately 15.5 miles away from the destination coordinates, the Arduino board and GPS tell me I'm only 12.75 miles away. When I am at the destination coordinates, it tells me I'm 17.79 miles away. All of my calculations are floating point. What am I doing wrong?