如何处理产生 NaN 的非常大的数字
How to deal with very big numbers producing NaN
我想定义如下非常简单的函数:
其中:
我目前的工作
prob <- function(x, n) {
quan <- qgamma(0.95, n, 1)
temp <- quan / (x)^2
first_term <- exp(-temp)
second_term <- temp^(0:(n - 1)) / factorial(0:(n - 1))
second_term <- sum(second_term)
first_term * second_term
}
这里的问题是,在大 n 的总和(第二项)中,我们处理的是非常大的数字,因此 R 将它们视为无穷大。
例如:
prob(0.5, n = 1000)
[1] NaN
因为 n = 1000 的分位数等于 1052.577,所以在分母中我们必须计算 1052.577^999,在分母中计算 999 的阶乘。R 将这两个数字理解为无穷大:
> factorial(999)
[1] Inf
> 1052.577^999
[1] Inf
所以当它试图划分它们时会产生 NaN
。然而,这个函数的输出总是在区间 (0, 1) 内,因为它是一个概率。有没有可能在这一点上计算这个函数的值?
您的 prob
函数只是 lambda = temp
和 k = n - 1
的累积泊松函数。使用 ppois
:
prob <- function(x, n) {
return(ppois(n - 1, qgamma(0.95, n, 1)/x^2))
}
prob(0.5, n = 1000)
# [1] 0
prob(0.5, n = 1000) = 0
因为 n - 1 = 999
与平均值相差甚远 (lambda = qgamma(0.95, 1000, 1)/0.5^2 = 4210.308
)。
我想定义如下非常简单的函数:
其中:
我目前的工作
prob <- function(x, n) {
quan <- qgamma(0.95, n, 1)
temp <- quan / (x)^2
first_term <- exp(-temp)
second_term <- temp^(0:(n - 1)) / factorial(0:(n - 1))
second_term <- sum(second_term)
first_term * second_term
}
这里的问题是,在大 n 的总和(第二项)中,我们处理的是非常大的数字,因此 R 将它们视为无穷大。
例如:
prob(0.5, n = 1000)
[1] NaN
因为 n = 1000 的分位数等于 1052.577,所以在分母中我们必须计算 1052.577^999,在分母中计算 999 的阶乘。R 将这两个数字理解为无穷大:
> factorial(999)
[1] Inf
> 1052.577^999
[1] Inf
所以当它试图划分它们时会产生 NaN
。然而,这个函数的输出总是在区间 (0, 1) 内,因为它是一个概率。有没有可能在这一点上计算这个函数的值?
您的 prob
函数只是 lambda = temp
和 k = n - 1
的累积泊松函数。使用 ppois
:
prob <- function(x, n) {
return(ppois(n - 1, qgamma(0.95, n, 1)/x^2))
}
prob(0.5, n = 1000)
# [1] 0
prob(0.5, n = 1000) = 0
因为 n - 1 = 999
与平均值相差甚远 (lambda = qgamma(0.95, 1000, 1)/0.5^2 = 4210.308
)。