3

C で書き直した R コードのブロックがあり、2 つのバージョンで異なる結果が得られます。私の考えでは、これは R レベルでの丸めの問題によるものです。つまり、C ですべてが行われ、丸めが 1 回だけ行われるのとは対照的に、複数の数学演算が実行され、複合丸めの問題が発生します。私はここで過度に楽観的であり、何かが欠けているかどうかを確認するためにもう少し目を向けたいと思っていました.

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

これらは機能的に同じですか、それとも間違ったことをしていますか?

4

1 に答える 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

于 2011-10-18T15:31:25.977 に答える