R&C版本的功能会产生不同的结果 - 舍入或操作员错误?

geo*_*try 3 c r rounding-error

我有一个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)
}
Run Code Online (Sandbox Code Playgroud)

现在在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);
}
Run Code Online (Sandbox Code Playgroud)

作为一个例子,传入值5,5,5,0给出了作为R 13.19和C.技术上12.69将R代码被矢量但C代码这个特定的块不是所以不希望提供一个矢量输入作为一个例子.

这些在功能上是相同的,还是我做错了什么?

pmg*_*pmg 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

  • @geoffjentry FWIW 13.19 vs 12.69相隔英里数.你不应该怀疑在这里四舍五入.总是很容易怀疑除了你自己以外的其他人,但大多数错误都归功于操作人员! (5认同)