Версии функций R & C дают разные результаты - округление или ошибка оператора? - PullRequest
3 голосов
/ 18 октября 2011

У меня есть блок кода 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 дает 13,19 в R и 12,69 в C. Технически код Rвекторизация, но этот конкретный блок кода на C не так, поэтому я не хочу приводить в качестве примера векторизованный ввод.

Они функционально одинаковы, или я делаю что-то неправильно?

1 Ответ

13 голосов
/ 18 октября 2011

Ваши выражения разные:

       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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...