c ++中acos函数的精度

时间:2015-09-05 15:47:47

标签: c++ stl

我正在尝试计算两点之间的距离并使用acos()函数进行处理...但我没有得到精确的结果......如果距离很小

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.我知道距离很小但有没有办法获得像0.xxx这样的精确距离?

1 个答案:

答案 0 :(得分:3)

使用double代替float来获得更高的精确度。

这样你就可以使用这个原型了:

double acos (double x);

必须阅读Difference between float and double问题。从那里我们有:

  1. 顾名思义,double的精度是float的2倍。
  2. C和C ++标准没有指定float的表示, 双倍和长双。这三个都可能实现为 IEEE双精度。然而,对于大多数架构(gcc, MSVC; x86,x64,ARM)float确实是IEEE的单精度 浮点数(binary32),double是IEEE 双精度浮点数(binary64)。