Resta el logaritmo máximo de todos los logaritmos. Desecha todos los resultados que sean tan negativos que desborden por debajo de la exponencial. (Sus probabilidades son, a efectos prácticos, cero).
En efecto, si desea una precisión relativa de ϵ (como \epsilon = 10^{-d} para d dígitos de precisión) y tiene n probabilidades, desechar cualquier resultado inferior al logaritmo de \epsilon/n . A continuación, proceda como de costumbre a exponenciar los valores resultantes y divida cada uno de ellos por la suma de todos los exponenciales.
Para los que les gusten las fórmulas, que los logaritmos sean \lambda_1, \lambda_2, \ldots, \lambda_n con \lambda_n = \max(\lambda_i) . Para logaritmos de base b\gt 1 define
\alpha_i = \cases{ b^{\lambda_i - \lambda_n}, \lambda_i - \lambda_n \ge \log(\epsilon)-\log(n) \\ 0\quad \text{otherwise}.}
Las probabilidades normalizadas son iguales a \alpha_i / \sum_{j=1}^n \alpha_j , i = 1, 2, \ldots, n. Esto funciona porque la sustitución de todo el desbordamiento de otra manera \alpha_i por cero comete un error total de como máximo (n-1)\epsilon/n\lt \epsilon Considerando que \alpha_n=b^{\lambda_n-\lambda_n}=b^0=1 y todos \alpha_i son no negativos, el denominador A = \sum_j \alpha_j \ge 1 por lo que el total relativa error debido a la regla de sustitución por cero es estrictamente menor que \left((n-1)\epsilon/n \right) / A \lt \epsilon según se desee.
Para evitar un error de redondeo excesivo, calcule la suma empezando por los valores más pequeños del \alpha_i . Esto se hará automáticamente cuando el \lambda_i se ordenan primero en orden creciente. Esto sólo debe tenerse en cuenta en el caso de n .
BTW, esta receta supone que la base de los troncos es mayor que 1 . Para las bases b menos de 1 primero niega todos los registros y procede como si la base fuera igual a 1/b .
Ejemplo
Sean tres valores con logaritmos (logaritmos naturales, digamos) iguales a -269647.432, -231444.981, y -231444.699. El último es el mayor; restándolo de cada valor se obtiene -38202.733, -0.282, y 0.
Supongamos que desea una precisión comparable a la de los dobles IEEE (unos 16 dígitos decimales), de modo que \epsilon=10^{-16} y n=3 . (En realidad no se puede lograr esta precisión, porque -0.282 se da sólo con tres cifras significativas, pero no pasa nada: sólo estamos desechando valores que está garantizado que no afectarán a la mejor entre la precisión que quieres y la que realmente tienes). Calcule \log(\epsilon/n) = \log(10^{-16}) - \log(3) = -37.93997. La primera de las tres diferencias, -38202.733, es menor que esto, así que tíralo, dejando sólo -0.282 y 0. Exponenciándolos se obtiene \exp(-0.282) = 0.754 y \exp(0)=1 (por supuesto). Los valores normalizados son, por orden 0 por el que tiraste, 0.754 / (1 + 0.754) = 0.430 y 1/(1+0.754)=0.570 .