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

标签 r floating-point precision r-faq

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

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舍入似乎是一个奇怪的错误。

最佳答案

在看不到您的数据的情况下无法准确分辨(尝试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))

关于r - acos(1)返回NaN的某些值,而不是其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026297/

相关文章:

r - 向表中添加因子水平

r - 使用 grepl 创建基于另一列的列

python - NumPy 中的 arctan2 差异

c++ - 从 float C++ 中提取数字

floating-point - 为什么 NaN 不等于 NaN?

floating-point - double 浮点格式的最大和最小指数

c++如何保存 vector 项和 double

从 R 中的向量中随机挑选对 153 次

r - 散点图 : Error in FUN(X[[i]], ...):找不到对象 'Group'

python - 在 Python 中,小 float 趋于零