由于 R 可以进行向量化计算,因此对结果向量和求和执行对数是安全的。
ll=function(x)sum(log(1:(x-1)))
这有什么好处?这可以计算无法计算的值log_gamma_recursive
。召回log_gamma_recursive
是一个嵌套函数,因此在某些时候会失败,具体取决于机器容量。例如:
log_gamma_recursive(3476)
[1] 24862.89
ll(3476)
[1] 24862.89
在这台机器上,log_gamma_recursive
不适用于任何大于 3476 的数字:
log_gamma_recursive(3477)
Error: C stack usage 7970456 is too close to the limit
另一方面,该ll
功能有效:
ll(3477)
[1] 24871.04
同时,ll
函数比函数快得多log_recursive
:
system.time(for(i in 1:10000)ll(3000))
user system elapsed
0.313 0.036 0.350
system.time(for(i in 1:10000)log_gamma_recursive(3000))
user system elapsed
20.569 0.100 20.794
这些单位以秒为单位!!