Вы пытаетесь найти log((exp(a) + exp(b) + exp(c))/3)
, но a
, b
и c
настолько низки, что результат exp
потери значимости до 0. Вы можете это исправить, регулируя значения так exp
не Underflow.
Let d = max(a, b, c)
. Тогда мы имеем следующее равенство:
M = log((exp(a) + exp(b) + exp(c))/3)
= log(exp(d) * (exp(a-d) + exp(b-d) + exp(c-d))/3)
= log(exp(d)) + log((exp(a-d) + exp(b-d) + exp(c-d))/3)
= d + log((exp(a-d) + exp(b-d) + exp(c-d))/3)
Таким образом, мы можем вычислить результат как d + log((exp(a-d) + exp(b-d) + exp(c-d))/3)
. Поскольку d
равно одному из a
, b
или c
, один из аргументов exp
равен 0, а остальные не более 0. Таким образом, один из выходов exp
равен 1, а остальные не более 1. Мы надеемся не нужно беспокоиться о переполнении или недостаточном потоке; в то время как недополнение может все еще происходить в одном или нескольких вызовах exp
, это не будет проблемой, поскольку аргумент log
не будет равен 0.