asin中的意外行为()

时间:2014-01-08 14:31:59

标签: r

我在R中使用asin()函数遇到了奇怪的行为。我有一个表达式偶尔会计算为-1,并传递给asin()。有时,asin()会以asin(-1) = 1.57....响应预期值NaNs produced

下面的代码给出了一个例子(来自计算昆虫生长程度天数的较大函数):

 # works
 tempMax <- 22.6
 tempMin <- 10.0
 threshold <- 10

 meanT     <- (tempMax + tempMin) / 2

 amplitude <- (tempMax - tempMin) /2

 thetaSub <- ( (threshold - meanT)/amplitude )

 thetaOut  <- asin( thetaSub)

 # fails
tempMax <- 22.7
tempMin <- 10.0
threshold <- 10

meanT     <- (tempMax + tempMin) / 2

amplitude <- (tempMax - tempMin) /2

thetaSub <- ( (threshold - meanT)/amplitude )

thetaOut  <- asin( thetaSub)

请注意,在两个示例中,thetaSub的计算结果为-1,但asin仅在第一个示例中“有效”。

测试函数似乎我在tempMin == threshold时得到NaNs,tempMax的整数值是偶数,小数部分是.7(例如,22.7,24.7,26.7)。

我怀疑这不是原因,而是其他案例引发同样的错误。我猜这与thetaSub如何解释asin的价值有关,但我无法弄清楚为什么它有时起作用而不是其他起作用。

修改。

@James已将我的问题确定为浮点问题。如何强制asin“忽略”小数位?

1 个答案:

答案 0 :(得分:7)

这是一个浮点问题。浮点数的工作方式是所有数字都需要映射到最接近的数字,可以表示为2的幂的有限和,这可能导致预期输出中的小的不准确性,并且可能取决于数字是如何计算

print(thetaSub,digits=22)
[1] -1.000000000000000222045

您应修改代码以使用asin(max(-1,min(1,thetaSub)))来防止此问题。如果您以矢量化方式进行计算,请改用pmaxpmin