我正在使用Rcpp
在C++
中集成一段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
答案 0 :(得分:2)
问题来自函数内部的if
语句。 <
的否定为>=
。因此,您应该在一个函数中将<
替换为<=
,或者在另一个函数中将>
替换为>=
,具体取决于预期的行为。
您的问题发生在2.0到2.9之间,因为abs(int)
将始终返回2
此范围。
abs(x)
获得int
返回int
。您的double x
会隐式转换为您的int
。