2014-01-08 154 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