r语言 - "linspace"函数的 RCPP 代码:增量为 1e-5 时矢量长度不正确



我想写一个类似于"linspace";以在R中创建具有Rcpp的相等间隔向量。这里的num_dis是我想要的该向量的间隔数,即a=0,b=10,num_dis=(10-0(/(1e-5(+1=1000001。当我放入linspace(0,101000001(时,向量长度正确为1000001;然而,当我像linspace(0,10,10/(1e-5(+1(这样写时,它返回一个长度为100000的向量。对于1e-3、e-6等增量,这似乎很好。我不太确定会发生什么?

NumericVector linspace(double a,double b,int num_dis) {
NumericVector u(num_dis);
for (int i = 0; i < num_dis; i++) {
u[i] = a + i * ((b - a) / (num_dis-1));
}
return u;
}

我认为这解释了一些事情:

> as.integer(10/(1e-5)+1)
[1] 1000000
> as.integer(10L*1e5L+1L)
[1] 1000001
> 

这已经作为您可以调用的Armadillo函数存在。(这行代码在这里分为两行显示,实际上是一行。(

R> Rcpp::cppFunction("arma::vec ls(double s, double e, int N) { 
return arma::linspace(s, e, N); }", depends="RcppArmadillo")
R> ls(1,2, 10)
[,1]
[1,] 1.00000
[2,] 1.11111
[3,] 1.22222
[4,] 1.33333
[5,] 1.44444
[6,] 1.55556
[7,] 1.66667
[8,] 1.77778
[9,] 1.88889
[10,] 2.00000
R> 

也就是说,获得";索引数学";表达式正确总是一个很好的调试练习。

最新更新