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

У меня есть блок кода 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 ответ

Решение

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

       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

Другие вопросы по тегам