2015-11-17 4 views
2

Из-за ошибки округления невозможно получить соотношение между двумя номерами: Ratio=exp(x)/(exp(x)+exp(y)) такое, что x=-1.11e4 и y=-1.12e4. Любой математический или вычислительный трюк?Избегайте ошибки округления при экспоненциальном расчете

+0

ехр (-1.11e4) дает нуль из-за ошибки округления. – BERKO

ответ

3

Как насчет математической обработки в лог-пространстве ...

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))] 

Теперь exp(y-x) должно быть разумное количество, так что вы можете рассчитывать, что легко. Затем конвертируйте обратно в нормальное пространство, используя R = exp(log(R)).

Если еще не работает, вы можете на самом деле taylor expand the last line:

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

для малого z, в этом случае z = exp(y-x).

+1

Можете ли вы дважды проверить свою работу - я думаю, здесь может быть небольшая ошибка: '= log [exp (x)] - log [exp (x) * (1 + exp (x)/exp (y))] '- это, вероятно, должно быть' = log [exp (x)] - log [exp (x) * (1 + exp (y)/exp (x))]?? –

+0

Спасибо @PaulR, абсолютно правильно! – DilithiumMatrix

+0

Хмм - все еще не совсем верно - работа над ним ... –

5

Вы можете упростить это следующим образом:

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)) 

(Это тот же результат, получаемый DiltihiumMatrix, но получается, не вдаваясь в логарифмической области и обратно.)

+1

Много приятнее. #offday – DilithiumMatrix

+0

Хех - это было только путем сбора дыр в вашей работе, что я видел, был более простой метод. ;-) –