C++ haversine距离计算函数首次调用正确后续返回错误值求解
问题修复方案
根因定位
你在haversine函数内直接修改了home指针指向的原始纬度数据:
home[0] = (home[0]) * M_PI / 180.0;
首次调用函数时,home[0]存储的是角度制的纬度值47.3977419,这行代码会直接将其覆盖为弧度值。后续再次调用函数时,已经是弧度值的home[0]会被再次按角度转弧度的逻辑计算,同时和其他角度制坐标做差值运算,最终得到异常的大数值结果。
修复代码
不要修改原始的home存储数据,将弧度转换逻辑放到临时变量中即可:
double Localization::haversine(double* first){ double currLat { first[0] }, currLong { first[1] }; double dLat { (home[0] - currLat) * M_PI / 180.0 }; double dLon { (home[1] - currLong) * M_PI / 180.0 }; double currLat_rad = currLat * M_PI / 180.0; double homeLat_rad = home[0] * M_PI / 180.0; double a { std::pow(std::sin(dLat / 2), 2) + std::pow(std::sin(dLon / 2), 2) * std::cos(currLat_rad) * std::cos(homeLat_rad) }; double rad { 6371e3 }; // 单位:米 double c { 2 * std::asin(std::sqrt(a)) }; return rad * c; }
其他注意事项
cost函数中通过new开辟的data数组没有配套的内存释放逻辑,会造成内存泄漏,使用完数组后需调用delete[] data回收空间。- 后续涉及单位换算类的逻辑,尽量避免直接修改原始源数据,所有转换操作都基于临时变量处理,避免源数据被意外污染。
内容的提问来源于stack exchange,提问作者NotALolicon
相关产品推荐
相关产品推荐

