如何计算两个坐标之间的距离(没有浮点数)?

Posted

技术标签:

【中文标题】如何计算两个坐标之间的距离(没有浮点数)?【英文标题】:How to calculate distance between two coordinates (without floats)? 【发布时间】:2012-03-08 15:33:54 【问题描述】:

我需要在没有浮点类型的嵌入式系统上计算两个坐标(经度、纬度)之间的距离(只有整数可用,所以没有三角函数,也没有像 sqrt 这样的浮点运算)。

这些点彼此非常接近,因此准确性不是问题。

所以我不能使用Haversine formula。我也不能使用这个基于毕达哥拉斯定理和equirectangular projection的简单算法:

x = Δlon * cos(lat)
y = Δlat
d = R * √(x² + y²)

因为我没有 cos 和 sqrt 函数。也许我可以以某种方式实现它们,但是这个算法必须很快(嵌入式系统)。

我最好的选择是毕达哥拉斯定理,但是如何在没有三角函数(也没有 sqrt)的情况下从度数到米数?

【问题讨论】:

你说“(没有浮点数)”并且你没有浮点运算 - 你的意思是你只有整数可以使用,还是你的意思是你有浮点数和一些一组操作(add、mul,也许是 sub 和 div)但不是 sqrt 和 trigs? 我只能处理整数。 【参考方案1】:

传统上,水手会使用遍历表进行此类计算——请参阅American Practical Navigator 的第 24 章。这表明如果trigsqrt 不在等式中,您可能会实现一个查找表——用空间换取复杂性。根据您的精确需求,您可能只需要您感兴趣的纬度的部分遍历表。

【讨论】:

这是一个很好的链接(美国实用导航员)。我认为这可能有助于解决我的问题。【参考方案2】:

实际上,您确实可以使用 sqrt 功能。查看Newton's method。这并不完美,因为你显然只有整数可以使用,我认为这意味着你的尾数会在每一步都被砍掉,但这是一个选择。还有其他平方根近似值。 (要实现余弦函数,也许您可​​以使用泰勒近似值,但我不确定它在这里的效果如何。)

【讨论】:

【参考方案3】:

根据您的用例,出租车/城市街区距离可能会有所帮助: https://en.wikipedia.org/wiki/Taxicab_geometry

【讨论】:

【参考方案4】:

地球上的每一度是 111133.333 米。

如何在没有 sqrt 的情况下到达那里是另一回事!想一想您使用的系统/软件没有这个基本的数学功能,我有点茫然?

您可以通过将所有内容提高到 1000 次方来解决浮点问题。这就是我们过去使用 Java ME 所做的事情(如果我没记错的话!!!)

【讨论】:

“在历史上,米被法国科学院定义为铂铱棒上两个标记之间的长度,它被设计为代表从赤道到地球距离的 1/10,000,000北极穿过巴黎”所以是的,1 纬度是 ~111133.333 米,通常是 ~104-113 公里(低误差)。但是1度的经度变化更大...... 嵌入式系统或 DSP 通常没有浮点计算。它不像人类看起来那么基本:) 这个答案具有误导性。作为第一个陈述的反论点,高纬度的经度长度可能比建议的要小得多,因为它在 +/- 90 度处消失为 0。航海家们都知道,纬度的长度也不是恒定的。我认为@Christy Herron 的意思是“乘以 1000”而不是“提高到 1000 的幂”。为什么即使是前一种方法也能在没有浮点运算的机器上引起兴趣,我不确定。 @High Performance Mark,对不起你的权利 - 我应该让自己更清楚。赤道的度数是 111133.333 米。至于乘以1000;我只是说你应该减少你的测量单位。因此,使用毫米而不是米是解决浮点问题的一种方法

以上是关于如何计算两个坐标之间的距离(没有浮点数)?的主要内容,如果未能解决你的问题,请参考以下文章

两大基本数据类型 - 整数类型 / 浮点数类型

如何将 map.getBounds() 作为 4 个浮点数的列表?

C++浮点数误差是啥

在多个视图控制器之间传递浮点数

C如何将两个浮点数相乘? [关闭]

如何在shell中对浮点数进行计算