使用Rcpp时仅正数的计算将返回负数

时间:2018-06-26 21:57:58

标签: rcpp

仅具有正数的计算将返回负数。

下面是源代码。

library(Rcpp)
sourceCpp(code = "
  #include <Rcpp.h>
  //[[Rcpp::export]]
  double test4(int n, int m, int i) {
    double out = (double)(n * i) / (double)(m + 1); 
    return out;
  }
")
test4(10000,1000000, as.integer(3*10^5))

使用大值作为参数时会发生这种现象。

我想要正确的返回值。

我应该怎么办?

谢谢。

1 个答案:

答案 0 :(得分:0)

问题是您要使用整数来乘积n * i。如果它们很大,则会得到整数溢出,因为32位带符号的int表示的最大数字为2147483647。对于带符号的整数,溢出将导致负数。一个简单的解决方法是在乘法之前进行强制转换:

library(Rcpp)
sourceCpp(code = "
  #include <Rcpp.h>
  //[[Rcpp::export]]
  double test4(int n, int m, int i) {
    double out = (double)n * i / (double)(m + 1); 
    return out;
  }
")
test4(10000,1000000, as.integer(3*10^5))

结果:

2999.997

顺便说一句,我不是在这里更改C样式的强制转换,但是通常C ++样式的强制转换是首选的恕我直言。