2015-11-17 3 views
2

En raison de l'erreur d'arrondi ne peut pas obtenir le ratio entre deux nombres: Ratio=exp(x)/(exp(x)+exp(y)) tel que x=-1.11e4 et y=-1.12e4. Une astuce mathématique ou informatique à faire?Eviter l'arrondi erreur dans le calcul exponentiel

+0

exp (-1.11e4) donne zéro en raison d'une erreur d'arrondi. – BERKO

Répondre

3

Que diriez-vous la manipulation mathématique dans le journal de l'espace ...

R = exp(x)/[exp(x)+exp(y)] 
log(R) = log[exp(x)] - log[exp(x)+exp(y)] 
     = log[exp(x)] - log[exp(x)*(1+exp(y)/exp(x))] 
     = log[exp(x)] - log[exp(x)*(1+exp(y-x)] 
     = log[exp(x)] - log[exp(x)] - log[(1+exp(y-x))] 
     = - log[(1+exp(y-x))] 

Maintenant, exp(y-x) devrait être un nombre raisonnable, de sorte que vous pouvez calculer facilement. Ensuite, retournez à l'espace normal en utilisant R = exp(log(R)).

Si ce ne fonctionne toujours pas, vous pouvez réellement taylor expand the last line:

log[(1+z)] ~ 1 + z^2/2 - z^3/3 ... 

pour les petits z, dans ce cas z = exp(y-x).

+1

Pouvez-vous revérifier votre travail - Je pense qu'il pourrait y avoir une petite erreur ici: '= log [exp (x)] - log [exp (x) * (1 + exp (x)/exp (y))] '- cela devrait probablement être' = log [exp (x)] - log [exp (x) * (1 + exp (y)/exp (x))] '? –

+0

Merci @PaulR, absolument raison! – DilithiumMatrix

+0

Hmm - toujours pas tout à fait raison - travailler dessus ... –

5

Vous pouvez simplifier comme ceci:

R = exp(x)/(exp(x) + exp(y)) 
    = exp(x)/(exp(x) * (1 + exp(y)/exp(x))) 
    =  1/(1 + exp(y)/exp(x)) 
    =  1/(1 + exp(y - x)) 

(Ceci est le même résultat que dérivé par DiltihiumMatrix, mais obtenu sans entrer dans le domaine du journal et à nouveau.)

+1

Beaucoup plus agréable. #offday – DilithiumMatrix

+0

Heh - ce n'est que par le biais de trous dans votre travail que j'ai vu qu'il y avait une méthode plus simple. ;-) –