3

我有一个用 C 重写的 R 代码块,这两个版本提供了不同的结果。我的信念是,这是由于 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,在 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 回答