2016-05-18 7 views
-1

Из-за ошибки округления не может получить среднее из трех чисел:арифметическая с показателем малых чисел

среднее значение = 1/3 * [ехр (а) + ехр (б) + ехр (с)] таким образом, что = -1.11e4 b = -1.12e4 и c = -1.13e4. Любой математический трюк? Или как получить результаты в значении журнала?

ответ

1

Вы пытаетесь найти 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.