Неочакван резултат от редица на Фибоначи, използвайки Rcpp

Тъкмо започвам да използвам Rcpp, така че съжалявам, ако пропускам лесна стъпка или нещо подобно... Опитах това от ?sourceCpp

library(Rcpp)
sourceCpp(code='
  #include <Rcpp.h>

  // [[Rcpp::export]]
  int fibonacci(const int x) {
    if (x == 0) return(0);
    if (x == 1) return(1);
    return (fibonacci(x - 1)) + fibonacci(x - 2);
  }'
)

До fibonacci(46) всичко е наред, но след това получавам:

> fibonacci(47)
[1] -1323752223
> fibonacci(48)
[1] 512559680
> fibonacci(49)
[1] -811192543
> fibonacci(50)
[1] -298632863

Според тази страница горното трябва бъда:

47 : 2971215073
48 : 4807526976
49 : 7778742049
50 : 12586269025

Получавате ли същия резултат?


person Michele    schedule 18.09.2013    source източник
comment
+1 за самостоятелен възпроизводим пример. Много добре.   -  person Simon O'Hanlon    schedule 18.09.2013
comment
@SimonO101 Благодаря за +1 (винаги се приема), но честно казано, току-що копирах и поставих от ?sourceCpp. Въпреки че вероятно бих могъл да направя функцията на фибоначи сам, аз не съм толкова добър в C :-(   -  person Michele    schedule 18.09.2013
comment
Освен това не се нуждаете от #include, който се добавя (заедно с други скелета) от sourceCpp().   -  person Dirk Eddelbuettel    schedule 18.09.2013
comment
@DirkEddelbuettel о, разбирам, благодаря. Както казах, буквално започнах вчера, така че засега просто следвах документите (и кода от вашите семинари) точно такива, каквито са, и дори правейки това, някои от тях не се компилират... идва въпрос.. .   -  person Michele    schedule 18.09.2013
comment
@DirkEddelbuettel тогава може би Хадли трябва да актуализира своето ръководство ... ?   -  person Simon O'Hanlon    schedule 18.09.2013
comment
Може би трябва да кажете това на му, а не на мен?   -  person Dirk Eddelbuettel    schedule 18.09.2013
comment
@DirkEddelbuettel Не, питам, следователно ?   -  person Simon O'Hanlon    schedule 18.09.2013
comment
Всъщност, няма значение, обърках се относно използването на низ с sourceCpp(), което е необичайно. Бих дефинирал функция на Фибоначи в един дълъг ред чрез cppFunction().   -  person Dirk Eddelbuettel    schedule 18.09.2013
comment
@DirkEddelbuettel добре, това е повече в съответствие с това, което си помислих [следвайки неговото ръководство! :-) ]   -  person Simon O'Hanlon    schedule 18.09.2013
comment
За пълнота: cppFunction('double fib(double x) { if (x<2) return x; else return fib(x-1)+fib(x-2); }')   -  person Dirk Eddelbuettel    schedule 18.09.2013
comment
@DirkEddelbuettel просто чисто любопитство: Rcpp е ваш, нали? Но вие казвате, че бих дефинирал Фибоначи ... сякаш имате предвид различно, така че предполагам, че някой друг е написал R Doc за Rcpp   -  person Michele    schedule 18.09.2013


Отговори (1)


Надвишавате максималния лимит за цели числа със знак (технически това би било long int предполагам ). Използвайте double вместо това...

library(Rcpp)
sourceCpp(code='
  #include <Rcpp.h>

  // [[Rcpp::export]]
  double fibonacci(const double x) {
    if (x == 0) return(0);
    if (x == 1) return(1);
    return (fibonacci(x - 1)) + fibonacci(x - 2);
  }'
)

fibonacci(47)
#[1] 2971215073
person Simon O'Hanlon    schedule 18.09.2013
comment
Ох добре. Всъщност замених int с long и даде същото число... Но не мислех за двойно, мислех, че дългото е достатъчно... Благодаря все пак! - person Michele; 18.09.2013
comment
int и long са с еднакъв размер. Но дори и да сте използвали по-голям тип цяло число, самият тип цяло число на R е толкова голям. - person Peyton; 18.09.2013
comment
@Peyton добре, благодаря. Мислех, че int е 16 бита и long 32 ... моя грешка! Благодаря момчета. - person Michele; 18.09.2013
comment
@Michele, зависи: stackoverflow.com/questions/589575/size-of-int-long- и т.н. - person Peyton; 18.09.2013
comment
Забележка: R има само int и double типове. Ако имате нужда от допълнителна прецизност на вашите цели числа, вие сте останали с double, освен ако не използвате пакет с добавки (напр. int64) - person Kevin Ushey; 18.09.2013