2011-10-18 6 views
3

私はCで書き直したRコードのブロックを持っています.2つのバージョンは異なる結果を提供します。これは、Rレベルでの丸め問題、つまりCで行われているすべての処理と一度だけ発生する丸め処理とは対照的に、複合丸め問題を作成する複数の演算が実行されているためです。私はここで過度に楽観的であると思うし、私は何かが欠けているかどうかを確認するためにいくつかの目のセットを望んでいた、そしてそれは実際に私の最後にコーディングが悪いだけです。関数のR&Cバージョンの結果が異なる - 丸め誤差または演算子エラー?

まずRコード:Cで今

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) 
} 

:例として

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 CにRで13.19と12.69を与え技術的にはRコードはベクトル化されていますが、Cコードのこの特定のブロックはそうではありませんので、例としてベクトル化された入力を提供したくありません。

これらは機能的に同じですか、間違っていますか?

+0

結果が異なるいくつかの入力と、対応する出力を提供できますか? – NPE

+0

どのくらい違いますか?私は3.1415対3.1416または2.7172対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はマイルと離れています。ここでは四捨五入が疑われるはずはありません。あなた自身以外の誰かを疑うことは常に魅力的ですが、ほとんどのバグは人間の操作員に任せられています!! –