2011-10-18 24 views
3

我有一塊R代碼,我用C重寫了,兩個版本提供了不同的結果。我的看法是,這是由於R級的舍入問題,即正在執行多個數學運算,這會產生複雜的舍入問題,而不是整個事情在C中完成,而舍入只發生一次。我擔心我在這裏過於樂觀,希望能有更多的眼睛來看看我是否錯過了一些東西,而實際上這只是糟糕的編碼而已。函數的R&C版本給出了不同的結果 - 舍入或操作員錯誤?

首先將R代碼:

h_tx <- function(x, sigma_nu, sigma_eta, alpha=0) { 
    b <- (sqrt(exp(sigma_eta^2) - 1))/sigma_nu 
    a <- -alpha * b 
    asinh(a+b*x) 
} 

現在,在C:

double hTx(double x, double sigmaNu, double sigmaEta, double alpha) { 
    double a; 
    double b; 
    double ret; 

    b = (sqrt(exp(pow(sigmaEta,2)-1)))/sigmaNu; 
    a = -alpha * b; 
    return asinh(a + b * x); 
} 

作爲一個例子,傳入值5,5,5,0給出了作爲R 13.19 12.69和在C.從技術上來說,R代碼是矢量化的,但是這個特定的C代碼塊並不是這樣,所以我不想提供一個矢量化輸入作爲例子。

這些功能是相同的,還是我在做一些不正確的事情?

+0

請提供一些結果不一致的輸入,以及相應的輸出。 – NPE

+0

有多少不同?我的意思是3.1415 vs 3.1416或2.7172 vs 1.4142? – BlackBear

+0

sqrt(exp(pow(sigmaEta,2)) - 1),錯誤位置 –

回答

13

你的表達式是不同的:

 
     b <- (sqrt(exp(sigma_eta^2) - 1))/sigma_nu 
      1 2 3-----------3 21 
      \ \------------------// 
       \----------------------/ 

-1是組括號的2:所述sqrt

 
     b = (sqrt(exp(pow(sigmaEta,2)-1)))/sigmaNu; 
      1 2 3 4----------4 321 
      \ \ \---------------/// 
      \ \------------------// 
       \----------------------/ 

-1是組括號的3:所述exp

+0

對,就是這樣。結果通常足夠接近,四捨五入似乎是可能的,但我不相信這個意見。操作員錯誤。 – geoffjentry

+6

+1爲圖 –

+5

@geoffjentry FWIW 13.19和12.69相隔數英​​裏。沒有辦法,你應該懷疑在這裏四捨五入。總是想要懷疑別人以外的人,但大部分的錯誤都歸於人類操作員! –