2016-03-07 4 views
0

У меня есть список очень малых экспоненциальных значений (например, exp(n), с n<-300), которые генерируются из файлов Gaussian PDF.Численные проблемы вычисления экспоненциальных чисел (из гауссовских PDF-файлов)

Я хочу, чтобы вычислить, сколько каждый из них пропорционально сумме, например, как в следующем питон, как псевдо-код делает:

s = 0 # sum of all values 
for n in exponents: 
    s += exp(n) 

for n in exponents: 
    k = exp(n)/s # I want to compute k for each n 

Проблема заключается в том, так как значения n все очень мало, суммирование s иногда оказывается равным нулю, и я получу ошибку деления на нуль.

Я знаю, что одна вещь, которую я могу сделать, - добавить постоянное значение (скажем 300) ко всем n, чтобы предотвратить недополнение, но это приведет к переполнению в других случаях.

Как я могу это решить?

Я не знаю, ясно ли я выразил себя, если в любом из них нет смысла или каких-либо ошибок грамматики, пожалуйста, исправьте меня. Спасибо заранее.

ответ

1

Как вы уже заметили, вы можете сделать это путем вычитания постоянного значения m из всех n.

Чтобы избежать переполнения, не выбирайте фиксированный m, такой как m = - 300. Вместо этого выберите m как максимум из всех n. Тогда каждое нормированное экспоненциальное значение будет не более 1, поэтому нормированная сумма будет не более чем на число экспонентов, что должно быть достаточно малым.