-->

ACOS(1)返回NaN一些价值观,不是别人(acos(1) returns NaN for som

2019-07-17 13:36发布

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

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

和地球半径乘以这个,在我使用的单位。 这是有效的,只要这些值我们采取的ACOS是在范围[-1,1]。 如果他们甚至略有超出此范围的,它会返回NaN ,即使差异是由于四舍五入。

我的问题是,有时,当两个纬度/长值是相同的,这给了我一个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 ,即使有些则没有。 这似乎是一个奇怪的错误有R圆角。

Answer 1:

不能确切地告诉没有看到你的数据(试行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]是使用pmaxpminacos(pmin(pmax(x,-1.0),1.0))



Answer 2:

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

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

现在确保了精度损失导致不超过正好为1的值。

这并不能说明发生了什么,但是。

(编辑:马修·伦德伯格指出我需要使用PMIN得到它拖进与量化的投入工作,这样可以解决问题用得到它的工作,但我仍然不知道为什么它被错误地舍入。)



文章来源: acos(1) returns NaN for some values, not others