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
Répondre
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)
.
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))] '? –
Merci @PaulR, absolument raison! – DilithiumMatrix
Hmm - toujours pas tout à fait raison - travailler dessus ... –
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.)
Beaucoup plus agréable. #offday – DilithiumMatrix
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. ;-) –
exp (-1.11e4) donne zéro en raison d'une erreur d'arrondi. – BERKO