r语言 - acos(1)对某些值返回NaN,而不是其他值



我有一个纬度和经度值的列表,我试图找到它们之间的距离。使用标准的大圆方法,我需要找到:

acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1))

乘以地球的半径,以我使用的单位。只要我们取的值在[-1,1]范围内,这是有效的。如果它们稍微超出这个范围,它将返回NaN,即使差异是由于四舍五入造成的。

我遇到的问题是,有时,当两个lat/long值相同时,这会给我一个NaN错误。即使是同一对数字,也不总是这样,但在一个列表中总是相同的数字。例如,我有一个人停在沙漠的路上:

Time  |lat     |long
1:00PM|35.08646|-117.5023
1:01PM|35.08646|-117.5023
1:02PM|35.08646|-117.5023
1:03PM|35.08646|-117.5023
1:04PM|35.08646|-117.5023

当我计算连续点之间的距离时,例如,第三个值将始终是NaN,即使其他值不是。

在没有看到数据的情况下无法准确判断(试试dput),但这很可能是FAQ 7.31的结果。

(x1 <- 1)
## [1] 1
(x2 <- 1+1e-16)
## [1] 1
(x3 <- 1+1e-8)
## [1] 1
acos(x1)
## [1] 0
acos(x2)
## [1] 0
acos(x3)
## [1] NaN

也就是说,即使你的值非常相似,它们的打印表示是相同的,它们仍然可能不同:有些将在.Machine$double.eps内,而其他则不会…

确保输入值被[-1,1]限定的一种方法是使用pmaxpmin: acos(pmin(pmax(x,-1.0),1.0))

一个简单的解决方法是使用pmin(),像这样:

acos(pmin(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1),1))

现在确保精度损失导致的值不高于1。

然而,这并不能解释发生了什么。

(编辑:马修·伦德伯格指出,我需要使用pmin来让它与矢量化输入一起工作。这解决了让它工作的问题,但我仍然不确定为什么它是不正确的。)

我刚刚遇到了这个。这是由大于1的输入引起的。由于计算误差,我的单位规范之间的内积变得比1大一点(如1+0.00001)。acos()只能处理[-1,1]。因此,我们可以将上界恰好限定为1来解决这个问题。

For numpy: np.clip(your_input, -1, 1)

For Pytorch: torch.clamp(your_input, -1, 1)

最新更新