Java:三角函数和双重不准确导致NaN

时间:2011-04-20 03:10:58

标签: java floating-point geospatial trigonometry double-precision

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

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。

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

3 个答案:

答案 0 :(得分:1)

检查代码中的两个非常接近(理想情况下相等)的值。例如:

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;
}

如果你得到一个真的,做cos(1.0)或其他

答案 1 :(得分:1)

如果您确实按照我的想法计算了大圆距离,那么您应该使用Vincenty公式代替您拥有的公式。

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

答案 2 :(得分:0)

只需检查平等就足以解决我的问题了:

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