2016-03-07 2 views
0

J'ai une liste de très petites valeurs exponentielles (par exemple exp(n), avec n<-300), qui sont générées à partir de PDF gaussiens.Problèmes numériques de calcul des nombres exponentiels (à partir de PDF gaussiens)

Je veux calculer combien chacun d'entre eux est proportionnelle à la somme, par exemple comme le pseudo-code python comme suit fait:

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 

Le problème est, puisque les valeurs de n sont très petit, la sommation s s'avère parfois nulle, et j'obtiendrai l'erreur de division par zéro.

Je sais qu'une chose que je peux faire est d'ajouter une valeur constante (disons 300) à tous n pour éviter les débordements, mais cela entraînera un débordement dans d'autres cas.

Comment puis-je résoudre ce problème?

Je ne sais pas si je me suis exprimé clairement, si l'un de ceux-ci n'a pas de sens ou d'erreurs de grammaire, s'il vous plaît corrigez-moi. Merci d'avance.

Répondre

1

Comme vous l'avez déjà observé, vous pouvez le faire en soustrayant une valeur constante m de tous n.

Pour éviter le débordement, ne choisissez pas un m fixe, tel que m = - 300. Au lieu de cela, choisissez m pour être le maximum de tous n. Ensuite, toute valeur exponentielle normalisée sera au plus 1, par conséquent la somme normalisée sera au plus le nombre d'exposants, qui devrait être raisonnablement petit.