计算指数数的数值问题(来自高斯PDF)

Numerical problems of computing exponential numbers (from Gaussian PDFs)

我有一个非常小的指数值列表(例如 exp(n)n<-300),它们是从高斯 PDF 生成的。

我想计算它们中的每一个与总和成正比的程度,例如像下面的 python-like 伪代码:

s = 0  # sum of all values
for n in exponents:
    s += exp(n)

for n in exponents:
    k = exp(n)/s  # I want to compute k for each n

问题是,由于n的值都非常小,求和s有时会变成零,我会得到被零除的错误。

我知道我能做的一件事是为所有 n 添加一个常量值(比如 300)以防止下溢,但在其他情况下会导致溢出。

我该如何解决这个问题?

不知道自己表达清楚没有,有什么不明白或者语法错误的地方,还请大家指正。 提前致谢。

正如您已经观察到的,您可以通过从所有 n.

中减去一个常数值 m 来实现

为避免溢出,请勿选择固定的m,例如m = - 300。相反,选择 m 作为所有 n 中的最大值。然后每个归一化指数值最多为 1,因此归一化总和最多为指数数,应该相当小。