2015-09-05 3 views
2

я пытаюсь вычислить расстояние между двумя точками и используя acos() функции в процессе ... но я не получаю точный result..in случая расстояния малТочности ACos функции в C++

float distance_between(dest& point1,dest point2) { 
float EARTH_RADIUS = 6371.0;//in km 
float point1_lat_in_radians = point1.lat*(PI/180); 
float point2_lat_in_radians = point2.lat*(PI/180); 
float point1_long_in_radians = point1.lon*(PI/180); 
float point2_long_in_radians = point2.lon*(PI/180); 

float res = acos(sin(point1_lat_in_radians) * sin(point2_lat_in_radians) + cos(point1_lat_in_radians) * cos(point2_lat_in_radians) * cos(point2_long_in_radians - point1_long_in_radians)) * EARTH_RADIUS; 
cout<<res<<endl; 
res = round(res*100)/100; 
return res; 
} 

я проверить расстояние между следующими координатами 52,378281 4.900070 и 52,379141 4,880590
52,373634 4.890289 и 52,379141 4,880590 результат в обоих 0 cases..i знать расстояние небольшое, но есть способ, чтобы получить точный расстояние, например 0.xxx?

+0

Почему один параметр передается как ссылка, а другой - копией? Я использую 'const dest &' для обоих. – Clifford

+0

Я с подозрением отношусь к вашему алгоритму. Расстояние * большого круга * между вашими двумя примерами составляет 1,326 км и 0,8991 км соответственно, но когда я проверил ваши расчеты со всеми значениями «двойной», он дает соответственно 2,170 км и 1,240 км. Необязательное округление знаменует значительную ошибку, но это не объясняет результаты, которые я получил. – Clifford

ответ

4

Используйте double вместо float, чтобы получить больше точности.

Таким образом, вы собираетесь использовать этот прототип:

double acos (double x);


Необходимо прочитать это Difference between float and double вопрос. Оттуда у нас есть:

  1. Как следует из названия, двойной имеет 2x точность поплавка.
  2. В стандартах C и C++ не указано представление float, двойное и длинное двойное. Возможно, что все три реализованы как IEEE с двойной точностью. Тем не менее для большинства архитектур (gcc, MSVC; x86, x64, ARM) float действительно является номером с плавающей запятой с одиночной точностью IEEE (двоичный файл), а double - это число с плавающей запятой с двойной точностью IEEE (двоичный код).
+0

Yo ... это сработало ... спасибо за помощь @gsamaras –

+0

Рад это слышать. Это то, что я совершил неправильно несколько лет назад, поэтому я поддержал это. Вы можете принять мой ответ, если хотите, чтобы другой пользователь увидел это как ответ в фиде вопроса. – gsamaras

+0

@gsamaras: знаете ли вы, что стандарт указывает какую-либо точность кстати? насколько я знаю, это полностью зависит от качества реализации ... –

Смежные вопросы