该问题由“条件良好”一词表示。这是计算机算术而不是数学的问题。
这里是要考虑的基本事实:
地球上的一个弧度跨度将近10 ^ 7米。
参数x接近0 的余弦函数大约等于1- x ^ 2/2。
双精度浮点的精度约为15个十进制数字。
点(2)和(3)表示,当x约为1米或10 ^ -7弧度(点1)时,几乎所有精度都会丢失:1-(10 ^ -7)^ 2 = 1-10 ^- 14是一种计算,其中15个有效数字中的前14个都被抵消,只剩下一个数字来表示结果。翻转此位置(这就是反余弦“ acos”的作用)意味着无法以任何有意义的精度来计算对应于米长度距离的角度的acos。 (在某些糟糕的情况下,精度损失会给出一个甚至未定义acos的值,因此代码将崩溃且不给出答案,无意义的答案或使机器崩溃。)类似的考虑因素建议您应避免使用反余弦值如果距离小于几百米,则取决于您愿意损失多少精度。
在原始的余弦定律公式中,acos扮演的角色是将角度转换为距离。在haversine公式中,atan2发挥了这一作用。小角度x的切线近似等于x本身。因此,近似于该数的数的反正切值基本上在精度上没有损失。这就是为什么Haversine公式虽然在数学上等效于余弦公式,但对于小距离(大约1米或更短),其优越性更高。
这是在地球上使用100个随机点对对这两个公式的比较(使用Mathematica的双精度计算)。
您可以看到,对于小于约0.5米的距离,这两个公式会发散。在0.5米以上,他们倾向于达成共识。为了显示它们之间的接近程度,下图显示了余弦定律:haversine结果对另外100个随机点对的比率,它们的纬度和经度之间的随机差异最大为5米。
这表明,一旦距离超过5-10米,余弦公式的法则就可以精确到小数点后3-4位。精度的小数位数增加了两倍;因此,在50-100米(一个数量级)上,您可以获得5-6 dp的精度(两个数量级);在500-1000米处,您会得到7-8 dp,依此类推。