Кто-нибудь знает библиотеку C с открытым исходным кодом, которая предоставляет logsumexp -функцию?
Функция logsumexp(a) вычисляет сумму экспонент log (e ^ {a_1} +... e ^ {a_n}) компонентов массива a, избегая численного переполнения.
Ответ 1
Здесь очень простая реализация с нуля (протестирована, по крайней мере, минимально):
double logsumexp(double nums[], size_t ct) {
double max_exp = nums[0], sum = 0.0;
size_t i;
for (i = 1 ; i < ct ; i++)
if (nums[i] > max_exp)
max_exp = nums[i];
for (i = 0; i < ct ; i++)
sum += exp(nums[i] - max_exp);
return log(sum) + max_exp;
}
Это позволяет эффективно делить все аргументы на самые большие, а затем добавлять его обратно в конец, чтобы избежать переполнения, поэтому он хорошо себя вел для добавления большого количества одинаково масштабированных значений с ошибками, ползущими в, если некоторые аргументы на много порядков больше других.
Если вы хотите, чтобы он выполнялся без сбоев при задании 0 аргументов, вам нужно добавить к нему случай:)