Вопрос относится к коду. Я написал функцию на Go и на C для вычисления расстояния в метрах между двумя точками. Но на разных языках функция выдаёт разный результат.
Вот код функции на Go:
const earthRadiusM = 6371000
func calculate_distance(lon1, lat1, lon2, lat2 float64) float64 {
lon_delta := lon2 - lon1
// convert degrees to radians
lat1_radians := lat1 * math.Pi / 180.0
lat2_radians := lat2 * math.Pi / 180.0
lon_delta_radians := lon_delta * math.Pi / 180.0
return earthRadiusM * math.Acos(math.Sin(lat1_radians) * math.Sin(lat2_radians) + math.Cos(lat1_radians) * math.Cos(lat2_radians) * math.Cos(lon_delta_radians))
}
И на C:
const int EARTH_RADIUS_M = 6371000;
double
calculate_distance
(double lon1, double lat1, double lon2, double lat2)
{
double lon_delta = lon2 - lon1;
// convert to radians
double lat1_radians = lat1 * M_PI / 180.0;
double lat2_radians = lat2 * M_PI / 180.0;
double lon_delta_radians = lon_delta * M_PI / 180.0;
return EARTH_RADIUS_M * acos(
sin(lat1_radians) * sin(lat2_radians) +
cos(lat1_radians) * cos(lat2_radians) * cos(lon_delta_radians)
);
}
Вот результат, который они выдают для точек 55.099879, 51.76003
и 55.100524, 51.764685
:
$ go run calculate_distance.go
519.5123039447425
519.5123039447425
$ gcc -lm calculate_distance.c
$ ./a.out
519.512286164
519.512286164
Почему результат настолько разный? Запускал на x86_64 64-bit. Я проверил на других языках — результат такой же как в C, отличия начинаются после 8 цифры после запятой:
$ php calculate_distance.php
519.51228616389
519.51228616389
$ node calculate_distance.js
519.5122861638861
519.5122861638861
Ответ: 1