我使用公式 exp(X) 作为马尔可夫链的速率。所以选择一个链接相对于另一个链接的比率是 exp(X1)/exp(X2)。我的问题是有时 X 非常大,所以 exp(X) 会超出 的范围double
。
或者:给定一个 X[i] 数组,其中一些 X[i] 大到 exp(X[i]) 溢出 的范围double
,计算每个 i 的 exp(X[i]) / S,其中 S是所有 exp(X[i]) 的总和。
我使用公式 exp(X) 作为马尔可夫链的速率。所以选择一个链接相对于另一个链接的比率是 exp(X1)/exp(X2)。我的问题是有时 X 非常大,所以 exp(X) 会超出 的范围double
。
或者:给定一个 X[i] 数组,其中一些 X[i] 大到 exp(X[i]) 溢出 的范围double
,计算每个 i 的 exp(X[i]) / S,其中 S是所有 exp(X[i]) 的总和。
这个伪代码应该可以工作:
Let M = the largest X[i].
For each i:
Subtract M from X[i].
Let S = the sum of exp(X[i]) for all i.
For each i:
The probability for this i is exp(X[i]) / S.
如果 M 很大,那么在减法步骤之后,一些 X[i] 将非常小(具有很大的负值),以至于它们的 exp(X[i]) 将以双精度计算为零。但是,这些项目的实际概率非常小,以至于它们的实际概率与零之间没有实际差异,因此 exp(X[i]) 下溢为零是可以的。
除了下溢和舍入误差之外,减法转换后的概率应该相同,因为: