Версии функций 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