Ron*_*nny 4 r factorial exponent
对于类赋值,我需要创建一个计算n选择k的函数.我做到了这一点,它适用于小数字(例如6选2),但我应该让它与200选择50,它自然不会.答案太大,R输出NaN或Inf,说:
> q5(200, 50)
[1] "NaN"
Warning message:
In factorial(n) : value out of range in 'gammafn'
Run Code Online (Sandbox Code Playgroud)
我尝试使用日志和指数,但它没有削减它.
q5 <- function (n, k) {
answer <- log(exp( factorial(n) / ( (factorial(k)) * (factorial(n - k)) )))
paste0(answer)
}
Run Code Online (Sandbox Code Playgroud)
实际问题的答案是R不能显示它无法表示的数字,并且等式中的某些项太大而无法表示.所以它失败了.然而,可以使用的是阶乘的近似值 - 它们使用的对数变得更慢.
最着名的一个,斯特林的近似,不够准确,但Ramanujan的近似来救援:)
ramanujan <- function(n){
n*log(n) - n + log(n*(1 + 4*n*(1+2*n)))/6 + log(pi)/2
}
nchoosek <- function(n,k){
factorial(n)/(factorial(k)*factorial(n-k))
}
bignchoosek <- function(n,k){
exp(ramanujan(n) - ramanujan(k) - ramanujan(n-k))
}
nchoosek(20,5)
# [1] 15504
bignchoosek(20,5)
# [1] 15504.06
bignchoosek(200,50)
# [1] 4.538584e+47
Run Code Online (Sandbox Code Playgroud)