首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Rcpp和int64_t R包将最大的C++变量值传递给R

通过Rcpp和int64_t R包将最大的C++变量值传递给R
EN

Stack Overflow用户
提问于 2020-06-04 18:36:11
回答 1查看 172关注 0票数 3

我已经写了一个函数来将2提升到给定的能力。我想使用64位整数。在R中,bit64包具有以下最大和最小限制:

来自R

代码语言:javascript
复制
> bit64::lim.integer64()
integer64
[1] -9223372036854775807 9223372036854775807 

这是-(2^63)2^63

但是,由于某些原因,我的Rcpp代码只能将2^62传回R。下面是将2提升到给定功率的函数代码(注意:我使用位移位来实现这一点):

C++代码:

代码语言:javascript
复制
// [[Rcpp::export]]
Rcpp::NumericVector i2_to_the_power_j ( int64_t j )
{

  int64_t base = 1;
  int64_t value = base << j;

  // cout << "C++ value: " << value << "\n";

  // Create a vector of length 1 with `value` as the sole contents
  const   std::vector<int64_t> v(1, value);
  const size_t len = v.size();

  Rcpp::NumericVector nn(len);         // storage vehicle we return them in

  // transfers values 'keeping bits' but changing type
  // using reinterpret_cast would get us a warning
  std::memcpy(&(nn[0]), &(v[0]), len * sizeof(double));

  nn.attr("class") = "integer64";
  return nn;

  return value;
}

但是,当我在R中运行这个程序时,我无法获得最大的可能/限制值!

来自R

代码语言:javascript
复制
>library(Rcpp)
>library(bit64)

> sourceCpp("./hilbert_curve_copy.cpp")

> # I can get 2^62
> i2_to_the_power_j(62)
integer64
[1] 4611686018427387904

> # ...but I cannot get 2^63
> i2_to_the_power_j(63)
integer64
[1] <NA>

> # I cannot get 2^63, despite bit64 package claiming it can
> # handle integers of this size
> bit64::lim.integer64()
integer64
[1] -9223372036854775807 9223372036854775807 

我漏掉了什么东西吗?请指点,谢谢你抽出时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 18:47:28

对我的快速猜测(被证明是正确的):最大值本身可能是标记为NA的值。因此,计算‘1减去’这个值,并尝试它。

快速猜测我的:最大值可能是标记为NA的值。因此,计算‘1-’这个值并尝试它。

代码语言:javascript
复制
// [[Rcpp::export]]
Rcpp::NumericVector largeval ( ) {
  int64_t val = 9223372036854775807LL - 1;
  Rcpp::Rcout << "C++ value: " << val << "\n";
  Rcpp::NumericVector dbl(1);
  std::memcpy(&(dbl[0]), &val, sizeof(double));
  dbl.attr("class") = "integer64";
  return dbl;
}

我将它添加到您的代码中并运行它,结果是:

代码语言:javascript
复制
R> largeval()
C++ value: 9223372036854775806
integer64
[1] 9223372036854775806
R> 

下面是完整的代码以防万一。

代码

代码语言:javascript
复制
#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector i2_to_the_power_j ( int64_t j )
{

  int64_t base = 1;
  int64_t value = base << j;

  // cout << "C++ value: " << value << "\n";

  // Create a vector of length 1 with `value` as the sole contents
  const   std::vector<int64_t> v(1, value);
  const size_t len = v.size();

  Rcpp::NumericVector nn(len);         // storage vehicle we return them in

  // transfers values 'keeping bits' but changing type
  // using reinterpret_cast would get us a warning
  std::memcpy(&(nn[0]), &(v[0]), len * sizeof(double));

  nn.attr("class") = "integer64";
  return nn;

  return value;
}

// [[Rcpp::export]]
Rcpp::NumericVector largeval ( ) {
  int64_t val = 9223372036854775807LL - 1;
  Rcpp::Rcout << "C++ value: " << val << "\n";
  Rcpp::NumericVector dbl(1);
  std::memcpy(&(dbl[0]), &val, sizeof(double));
  dbl.attr("class") = "integer64";
  return dbl;
}


/*** R
library(bit64)
# I can get 2^62
i2_to_the_power_j(62)

# ...but I cannot get 2^63
i2_to_the_power_j(63)

# I cannot get 2^63, despite bit64 package claiming it can
# handle integers of this size
bit64::lim.integer64()

largeval()
*/
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62201852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档