我用式EXP(X)作为用于马尔可夫链的速率。 所以选择一种优于另一种链路的比例为EXP(X1)/ EXP(X2)。 我的问题是,有时X是非常大的,因此EXP(X)将超过范围double
。
可替换地:给定X [I]的阵列,一些X [I]如此之大,EXP(X [1])溢出的范围内double
,计算,对于每个i,实验值(X [1])/ S,其中S是所有exp的总和(X [1])。
我用式EXP(X)作为用于马尔可夫链的速率。 所以选择一种优于另一种链路的比例为EXP(X1)/ EXP(X2)。 我的问题是,有时X是非常大的,因此EXP(X)将超过范围double
。
可替换地:给定X [I]的阵列,一些X [I]如此之大,EXP(X [1])溢出的范围内double
,计算,对于每个i,实验值(X [1])/ S,其中S是所有exp的总和(X [1])。
这个伪代码应工作:
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]将是如此小(具有大的负值),他们的实验值(X [1])将在双精度评价为零。 然而,这些项目的实际概率是如此微不足道,有自己的实际概率和零之间没有实际区别,所以它是好的,是EXP(X [1])下溢到零。
除了下溢和舍入误差,概率应该是减法改造后是相同的,这是因为: