我在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“忽略”小数位?
答案 0 :(得分:7)
这是一个浮点问题。浮点数的工作方式是所有数字都需要映射到最接近的数字,可以表示为2的幂的有限和,这可能导致预期输出中的小的不准确性,并且可能取决于数字是如何计算
print(thetaSub,digits=22)
[1] -1.000000000000000222045
您应修改代码以使用asin(max(-1,min(1,thetaSub)))
来防止此问题。如果您以矢量化方式进行计算,请改用pmax
和pmin
。