2015-05-15 29 views
3

考慮計算如何避免的NaN由於舍入誤差

x * -3/10 + sqrt(1/20 - x^2/100) 

x=sqrt(5)。由於舍入誤差,sqrt參數變爲負數,整個表達式的結果爲NaN

> x <- sqrt(5) 
> x * -3/10 + sqrt(1/20 - x^2/100) 
[1] NaN 
Warning message: 
In sqrt(1/20 - sqrt(5)^2/100) : NaNs produced 

正確的結果是

> sqrt(5) * -3/10 
[1] -0.6708204 

回答

5

如果你不想平方根返回NaN值,一種選擇是隻使用pmax,以確保其說法至少是0:

x * -3/10 + sqrt(pmax(0, 1/20 - x^2/100)) 
# [1] -0.6708204 

如果你希望它返回NaN當參數sqrt是相當不利,但0時,它的真正接近0但是負值,那麼ifelse可能有幫助:

x <- sqrt(4:6) 
special.sqrt <- function(x) ifelse(x < -1e-10, NaN, sqrt(pmax(0, x))) 
x * -3/10 + special.sqrt(1/20 - x^2/100) 
# [1] -0.5000000 -0.6708204  NaN