Мой основной вопрос: почему результаты различаются для этих четырех реализаций факториальной функции и, более конкретно, почему функции начинают различаться при n = 13?
library(Rcpp)
cppFunction(' int facCpp(int n)
{
if (n==0) return 1;
if (n==1) return 1;
return n*facCpp(n-1);
}
')
cppFunction(' double fac2Cpp(int n)
{
if (n==0) return 1;
if (n==1) return 1;
return n*fac2Cpp(n-1);
}
')
cppFunction(' long int fac3Cpp(long int n)
{
if (n==0) return 1;
if (n==1) return 1;
return n*fac3Cpp(n-1);
}
')
c(factorial(12),prod(1:12),facCpp(12),fac2Cpp(12),fac3Cpp(12))
c(factorial(13),prod(1:13),facCpp(13),fac2Cpp(13),fac3Cpp(13))
c(factorial(20),prod(1:20),facCpp(20),fac2Cpp(20),fac3Cpp(20))
c(factorial(40),prod(1:40),facCpp(40),fac2Cpp(40),fac3Cpp(40))
Я понимаю, что вопрос, возможно, является дубликатом, поскольку ответы, вероятно, предлагаются здесь Rcpp, создание кадра данных с вектором long long, который также показывает, почему функции начинают различаться для f(13)
2^31-1>facCpp(12)
#> [1] TRUE
2^31-1>13*facCpp(12)
#> [1] FALSE
c(factorial(12),prod(1:12),facCpp(12),fac2Cpp(12),fac3Cpp(12))
#>[1] 479001600 479001600 479001600 479001600 479001600
c(factorial(13),prod(1:13),facCpp(13),fac2Cpp(13),fac3Cpp(13))
#> [1] 6227020800 6227020800 1932053504 6227020800 1932053504
c(factorial(20),prod(1:20),facCpp(20),fac2Cpp(20),fac3Cpp(20))
#> [1] 2.432902e+18 2.432902e+18 -2.102133e+09 2.432902e+18 -2.102133e+09
int
, ниlong int
. 13! переполняетint
, но неlong int
. 40! переполняет оба. То, что вы видите, является переполнением в вашем коде C++. - person josliber♦   schedule 17.04.2014long int
, поэтому fac3Cpp становится facCpp. - person Jesper Hybel Pedersen   schedule 17.04.2014fac3Cpp(13)
дает правильный результат на моем компьютере. Пожалуйста, обновите свой пост, указав результат, который вы видите, чтобы получить помощь по устранению несоответствия, которое вы видите. - person josliber♦   schedule 17.04.2014int
. Так что я думаю, что в целом нельзя быть уверенным, чтоlong int
решит проблему. ... Я обновлю свой пост выводом. - person Jesper Hybel Pedersen   schedule 17.04.2014