Неожиданный результат ряда Фибоначчи с использованием 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
На самом деле, неважно, я запутался в использовании string с 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, и это дало тот же номер... Но я не думал о двойном, я думал, что 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
@ Мишель, это зависит: 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