2014-01-08 106 views
0

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

下面的代码给出的例子(从更大的函数,计算生长度日昆虫):

# 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 == thresholdtempMax的整数值为偶数且小数部分为.7(例如22.7,24.7,26.7)时,测试函数似乎得到了NaN。

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

编辑。

@詹姆斯已经确定我的问题是浮点问题。我如何强制asin'忽略'小数位?

+0

第二个'thetaSub'实际上低于'-1'。 –

+0

回复:您的编辑,我扩大了我的答案与可能的解决方案 – James

回答

7

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

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

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

+0

这是行得通!多谢! – Chris