Из-за ошибки округления невозможно получить соотношение между двумя номерами: Ratio=exp(x)/(exp(x)+exp(y))
такое, что x=-1.11e4
и y=-1.12e4
. Любой математический или вычислительный трюк?Избегайте ошибки округления при экспоненциальном расчете
ответ
Как насчет математической обработки в лог-пространстве ...
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)
.
Можете ли вы дважды проверить свою работу - я думаю, здесь может быть небольшая ошибка: '= log [exp (x)] - log [exp (x) * (1 + exp (x)/exp (y))] '- это, вероятно, должно быть' = log [exp (x)] - log [exp (x) * (1 + exp (y)/exp (x))]?? –
Спасибо @PaulR, абсолютно правильно! – DilithiumMatrix
Хмм - все еще не совсем верно - работа над ним ... –
Вы можете упростить это следующим образом:
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, но получается, не вдаваясь в логарифмической области и обратно.)
Много приятнее. #offday – DilithiumMatrix
Хех - это было только путем сбора дыр в вашей работе, что я видел, был более простой метод. ;-) –
ехр (-1.11e4) дает нуль из-за ошибки округления. – BERKO