两个明显相似的函数给出了不同的结果。为什么?

时间:2016-01-15 13:30:20

标签: c++ r rcpp

我正在使用RcppC++中集成一段R代码。我在两个方面在C++中实现了一个函数:

// [[Rcpp::export]]
double rhobiweight(double x,double k = 2.0){
  double rho = 1.0;
  if(abs(x)<k){
    rho = 1.0-pow((1.0-pow(x/k,2)),3);
  }
  return rho/Erho(k) ;
}

// [[Rcpp::export]]
double rhobiweight2(double x,double k = 2.0){
  double rho = 1.0-pow((1.0-pow(x/k,2)),3);
  if(abs(x)>k){
    rho = 1.0;
  }
  return rho/Erho(k) ;
}

如果x - 值介于2和3之间,我会得到这些函数的不同结果。我无法弄清楚原因。

> set.seed(1)
> x = 3*rnorm(10^5)
> c = x
>   c2 = x
>   for(i in 1:length(x)){
+     c[i] = rhobiweight(x[i])
+     c2[i] = rhobiweight2(x[i])
+   }
>   print(sum(c-c2))
[1] -18564.31

1 个答案:

答案 0 :(得分:2)

问题来自函数内部的if语句。 <的否定为>=。因此,您应该在一个函数中将<替换为<=,或者在另一个函数中将>替换为>=,具体取决于预期的行为。

您的问题发生在2.0到2.9之间,因为abs(int)将始终返回2此范围。

abs(x)获得int返回int。您的double x会隐式转换为您的int