带有R包的负Fibonacci项F(50)" Rcpp"

时间:2017-05-02 18:58:36

标签: c++ r

我使用了R package" Rcpp"提供的示例。并获得了负50的斐波那契项:

fib <- Rcpp::cppFunction(
  'int fibonacci(const int x) {
      if (x == 0) return(0); 
      if (x == 1) return(1);
      return (fibonacci(x - 1)) + fibonacci(x - 2);
  }')

fib(50)
# [1] -298632863

让我好奇地检查整个序列到F(50):

sapply(seq(50), fib)

事实证明,负面条款以F(47)开头显示:

[1]   1  1  2  3  5  8  13  21  34
.
.
[10]  55  89 144 . . .
.
.
[46]  1836311903 -1323752223   512559680  -811192543  -298632863

欢迎任何见解!

sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 14393)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.4.0 tools_3.4.0    inline_0.3.14  Rcpp_0.12.10  

2 个答案:

答案 0 :(得分:2)

就像MrFlick评论的那样,这可能与int的范围有关。

如果我们假设这是一个32位整数,则整数可以具有的最大值是2 ^ 31-1或2,147,483,647,最小值为-2 ^ 31,第32位用于符号(积极的还是消极的)。

使用Fibonacci序列,第一个大于32位整数的数字可以处理的是第47个术语,应该是2,971,215,073,超过最大值2,147,483,647。

在十六进制中,第47项将是0xB11924E1,其被解释为整数具有符号位设置,因此被解释为负数,-1323752223。

一个简单的方法可以看到这个说明是在程序员模式下使用Windows计算器,它可以显示哪些位设置为什么数字,并且您可以在Qword(64位)和Dword(32位)之间切换以查看限制为32位。

See this link for expected Fibonacci values

答案 1 :(得分:0)

看起来你超过了C ++整数的最大值,即2147483647。这是一个用R本身编写的更高效的实现,它使用循环而不是递归结构。这也避免了增长矢量。

fibo <- function(x) {

    if (x == 0) {
        return(0)
    } else if (x %in% 1:2) {
        return(1)
    }

    the.seq <- rep(NA, x)
    the.seq[1:2] <- 1
    for (i in 3:x) {
        the.seq[i] <- the.seq[i - 1] + the.seq[i - 2]
    }

    return(the.seq[x])
}