Java 为什么这个轴承计算如此不精确?

Java 为什么这个轴承计算如此不精确?,java,gis,precision,double-precision,Java,Gis,Precision,Double Precision,甚至有那么不准确吗?我以Apfloat任意精度重新实现了整个过程,这与我应该知道的开始没有任何区别 public static double bearing(LatLng latLng1, LatLng latLng2) { double deltaLong = toRadians(latLng2.longitude - latLng1.longitude); double lat1 = toRadians(latLng1.latitude); double lat2 = toRadia

甚至有那么不准确吗?我以Apfloat任意精度重新实现了整个过程,这与我应该知道的开始没有任何区别

public static double bearing(LatLng latLng1, LatLng latLng2) {
 double deltaLong = toRadians(latLng2.longitude - latLng1.longitude);

 double lat1 = toRadians(latLng1.latitude);
 double lat2 = toRadians(latLng2.latitude);

 double y = sin(deltaLong) * cos(lat2);
 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLong);
 double result = toDegrees(atan2(y, x));
 return (result + 360.0) % 360.0;
}

@Test
 public void testBearing() {

  LatLng first = new LatLng(36.0, 174.0);
  LatLng second = new LatLng(36.0, 175.0);
  assertEquals(270.0, LatLng.bearing(second, first), 0.005);
  assertEquals(90.0, LatLng.bearing(first, second), 0.005);
 }
测试中的第一个断言给出:

java.lang.AssertionError: 预期:但是 是:

0.29似乎还有很长的路要走?这就是我选择实施的方案吗

java.lang.AssertionError:应为:但为:

该0.29绝对误差表示0.1%的相对误差。这是怎么回事

浮点数将给出7个有效数字;双打适合16人。可以是三角函数,也可以是度到弧度的转换

如果可以相信的话,这个公式看起来是正确的


如果我将起始值和最终值插入该页面,它们报告的结果为089°42′22〃。如果我从360减去你的结果,再换算成度、分和秒,你的结果和他们的结果是一样的。要么你们都对,要么你们都错。

你们确定这是因为数字问题吗?我必须承认,我不知道你想计算什么,但当你处理球体上的角度时,与你在欧几里得几何中所期望的有一些小偏差。

如果你已经做了你似乎已经做过的事情,并且做得正确,你已经计算出了a从B到B的最短路径上的方位,在球形(ish)地球表面上是A和B之间的大圆弧,而不是A和B之间的纬度线弧

Mathematica的大地测量函数为您的测试位置提供了方向,如
89.7061
270.294


因此,看起来似乎(a)您的计算是正确的,但(b)您的导航技能需要提高。

您是否使用任意精度触发器?是否可以添加toradian和toDegrees?使用java.lang.Math触发器函数并导入静态java.lang.Math.toDegrees;导入静态java.lang.Math.toRadians;如果这是由于数值误差造成的,那么对于这样一个简单的计算来说还有很长的路要走。有时还有很大的偏差。非常正确。将测试参数更改为0.0度纬度,测试通过。关于(b)你是对的。让我举个例子来巩固我的理解。如果我想从巴黎(48,-2)走到慕尼黑(48,-11),我不会走正东方向,而是以86.652度的角度。如果你想从英国的某个地方步行到格陵兰岛,你就不会沿着与纬度线平行的线走(纬度线平行吗??)。好吧,你会开始沿着那个方向走(忘记道路和障碍物),但你会在走路时不断调整你的方向;大圆路线(通常)不遵循恒定方位线(或斜向线)。但事情开始变得复杂起来,鲍迪奇说。