You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:48:00