如何处理产生 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 = tempk = 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)。