Мой вывод кажется немного неверным при вычислении расстояния между двумя координатами широты и долготы, и я не могу понять, почему. Ниже мой код (реализация формулы Хаверсина)
float calcDistance(double latHome, double lonHome, double latDest, double lonDest) {
double pi = 3.141592653589793;
int R = 6371; //Radius of the Earth
latHome = (pi/180)*(latHome);
latDest = (pi/180)*(latDest);
double differenceLon = (pi/180)*(lonDest - lonHome);
double differenceLat = (pi/180)*(latDest - latHome);
double a = sin(differenceLat/2) * sin(differenceLat/2) +
cos(latHome) * cos(latDest) *
sin(differenceLon/2) * sin(differenceLon/2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double distance = R * c;
printf("%f\n", distance);
return distance;
}
Ввод: 38,898556 -77,037852 38,897147 -77,043934
Выход: 0,526339
Должно получиться 0,5492
2*atan2(sqrt(a), sqrt(1-a));
имеет только один квадрант ответа. С таким же успехом можно использовать2*asin(sqrt(a))
для поддержания точности. - person chux - Reinstate Monica   schedule 17.09.2015