c - 限制纬度和经度值的模数

标签 c math floating-point intervals modulo

我有代表纬度和经度的 double 值。
我可以使用以下函数轻松地将经度限制为 (-180.0, 180.0]

double limitLon(double lon)
{
  return fmod(lon - 180.0, 360.0) + 180.0;
}

之所以可行,是因为一端是排他性的,而另一端是包容性的。 fmod 包括 0 但不包括 -360.0。

谁能想到一个优雅的纬度方法?
所需的间隔为 [-90.0, 90.0]。封闭形式的解决方案是最好的,即没有循环。我认为 fmod() 可能无法启动,因为现在两端都包含在内。

编辑: 正如所指出的,无论如何都不能到达 91 度纬度。从技术上讲,91 应映射到 89.0。天哪,这改变了一切。

最佳答案

有一种比使用 sin 和 arcsin 更有效的方法来做到这一点。最昂贵的操作是单个除法器。所需间隔闭合的观察结果是关键。

  • 除以 360 并取余数。这会在区间 [0, 360) 中产生一个数字,如观察到的那样,它是半开的。

  • 将区间对折。如果余数 >=180,则用 360 减去它。这会将区间 [180, 360) 映射到区间 (0, 180]。这个区间的并集下半部分是闭区间 [0, 180]

  • 从结果中减去 90。根据需要,此间隔为 [-90, 90]

这确实是与 arcsin(sin(x)) 完全相同的函数,但没有任何费用或任何数值稳定性问题。

关于c - 限制纬度和经度值的模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368525/

相关文章:

algorithm - 计算用于定义二次贝塞尔曲线分段的参数

algorithm - 理解 C(n,2)= n(n−1)/2 的左手符号

r - 在 R 中获取导数

.net - SSE 浮点算术是否可重现?

c - 在 QuickSort 中交换两个变量时会发生奇怪的事情

c - 线程变化的开始已经设置了全局变量

c - Arduino 上的 FT801 芯片 ID 错误

c - 空间与时间局部性

C 编程 - float 条件的 while 循环的异常行为

Haskell 将 Float 转换为 Int