我有一个递归因子
recursive.factorial <- function(x) {
if (x == 0) return (1)
else return (x * recursive.factorial(x-1))
}
只是好奇在我的recursive.factorial v.s中的最大x是什么?R中的build-int factorial()函数?有没有办法检查
答案 0 :(得分:2)
计算机数值的位跨度似乎比“计算机内存”更容易出现问题,我假设你的意思是RAM的地址空间。 R中可以无需近似表示的整数的最大值(以及使用通常的IEEE标准的任何软件包)是2 ^ 53 - 1.还有其他包(其中一些可用作R包)可以支持任意精度NUMERICS。 ?Recall
函数是一种更稳定的递归方法,虽然它没有在R中优化。integer.max
设置在2个字节可获得的精度:
2^32-1
[1] 4294967295
最近引入的“长整数”最大值出现在浮点尾数的“双倍”上。
> 2^53-1
[1] 9.007199e+15
> print( 2^53-1, digits=18)
[1] 9007199254740991
因此,只要您获得大于该限制的factorial(n)
值,您就会得到一个近似值,当您超过“双”数字的取幂限制时,您将获得“Inf”。我的factorial
版本似乎与您的版本具有相同的突破点:
> fact <- function(n)
+ if(n==0) { 1} else{ (n) *Recall(n-1)}
> fact (170)
[1] 7.257416e+306
> fact (171)
[1] Inf
这是计算阶乘的另一种思考方式:
> exp( sum(log(1:15)))
[1] 1.307674e+12
> factorial(15)
[1] 1.307674e+12
“斯特林近似”通常用于加速阶乘的计算。要获得更准确的值,您可以安装gmp
或Rmpfr
个包。