Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇两个地理位置之间的距离:NaN_Java_Geolocation - Fatal编程技术网

Java 爪哇两个地理位置之间的距离:NaN

Java 爪哇两个地理位置之间的距离:NaN,java,geolocation,Java,Geolocation,我有这段代码,根据两个IP地址对应的纬度和经度计算它们之间的近似物理距离 public static double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.c

我有这段代码,根据两个IP地址对应的纬度和经度计算它们之间的近似物理距离

public static double distance(double lat1, double lon1, double lat2, double  lon2) 
{
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + 
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));

dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}
lat和long是有符号值。但是,此代码有时将dist返回为NaN

我错过什么了吗?θ需要是绝对值吗

更新: 返回Nan的测试值:-

lat1=-23.5477,lon1=-46.6358,lat2=-23.5477,lon2=-46.6358


lat1=53.3331,lon1=-6.2489,lat2=53.3331,lon2=-6.2489

当两个输入点相同时,以下表达式返回的结果略大于1(1.0000000000002)

这一定是由于浮点运算的精度有限(或三角函数的精度有限)

Math.acos(dist)
如果
dist
>1,则返回NaN。你可以通过简单的改变来克服这个问题

dist = Math.acos(dist);


一些测试数据可能会有帮助,您是否尝试过任何类型的调试?也许会把数值打印出来?我会用测试数据更新这个问题。@mad程序员添加测试数据,你的起点和终点是一样的吗?
dist = Math.acos(dist);
dist = Math.acos(Math.min(dist,1));