如何计算两个坐标之间的距离(没有浮点数)?
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 章。这表明如果trig
和sqrt
不在等式中,您可能会实现一个查找表——用空间换取复杂性。根据您的精确需求,您可能只需要您感兴趣的纬度的部分遍历表。
【讨论】:
这是一个很好的链接(美国实用导航员)。我认为这可能有助于解决我的问题。【参考方案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;我只是说你应该减少你的测量单位。因此,使用毫米而不是米是解决浮点问题的一种方法以上是关于如何计算两个坐标之间的距离(没有浮点数)?的主要内容,如果未能解决你的问题,请参考以下文章