Java:三角函数和双重误差导致 NaN

发布于 2024-11-02 12:58:34 字数 469 浏览 7 评论 0原文

我有一个使用纬度和经度的距离公式:

distance = EARTH_MILES_RADIUS
    * Math.acos(Math.sin(lat1 / RADIAN_CONV)
    * Math.sin(lat2 / RADIAN_CONV)
    + Math.cos(lat1 / RADIAN_CONV)
    * Math.cos(lat2 / RADIAN_CONV)
    * Math.cos((lng2 - lng1) / RADIAN_CONV));

lat1,lng1,lat2,lng2 是双原语。它们作为双重原语来到我这里,我对此无能为力。

问题是,当我有一对相同的经度或纬度时,公式有时会返回 NaN。我相信这是因为我取的是一个略大于 1 的数字的反余弦,而实际上它应该正好是 1。如果这些点也是对映的,我可能会遇到问题,它们可能略小于 - 1.

我怎样才能最好地解决这个问题?

I have a distance formula using latitude and longitude:

distance = EARTH_MILES_RADIUS
    * Math.acos(Math.sin(lat1 / RADIAN_CONV)
    * Math.sin(lat2 / RADIAN_CONV)
    + Math.cos(lat1 / RADIAN_CONV)
    * Math.cos(lat2 / RADIAN_CONV)
    * Math.cos((lng2 - lng1) / RADIAN_CONV));

lat1,lng1,lat2,lng2 are double primitives. They come to me as double primitives and there is nothing I can do about it.

The problem is that when I have a pair of longitude or latitudes that are the same the formula sometimes returns NaN. I believe this is because I am taking the arc cosine of a number very slightly greater than 1, when in fact it should be exactly 1. I would probably have problems if the points were antipodal as well, where they might be slightly less than -1.

How can I best fix this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我不吻晚风 2024-11-09 12:58:34

如果您确实像我认为的那样计算大圆距离,则应该使用文森蒂公式而不是您所拥有的公式。

http://en.wikipedia.org/wiki/Great-circle_distance

If you are indeed calculating great circle distance as I think you are, you should use the Vincenty formula instead of what you have.

http://en.wikipedia.org/wiki/Great-circle_distance

踏雪无痕 2024-11-09 12:58:34

检查代码中是否有两个非常接近(最好相等)的值。例如:

boolean doubleApproxEqual(double a, double b) {
    double PRECISION = 0.000001;
    if (Math.abs(a-b) < PRECISION) //not sure what the name of the function is
                                   //cannot be bothered to check
        return true;
    return false;
}

如果你得到 True,则执行 cos(1.0) 或其他操作

Check for two very close (ideally equal) values in your code. For example:

boolean doubleApproxEqual(double a, double b) {
    double PRECISION = 0.000001;
    if (Math.abs(a-b) < PRECISION) //not sure what the name of the function is
                                   //cannot be bothered to check
        return true;
    return false;
}

if you get a True, do cos(1.0) or whatever

禾厶谷欠 2024-11-09 12:58:34

简单地检查是否相等就足以解决我的问题:

if (lat1 == lat2 && lng1 == lng2) ...

Simply checking for equality was enough to fix my problem:

if (lat1 == lat2 && lng1 == lng2) ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文