関数を提供するオープンソースの数値 C ライブラリを知っている人はいlogsumexp
ますか?
このlogsumexp(a)
関数は、数値オーバーフローを回避して、配列 a のコンポーネントの指数 log(e^{a_1}+...e^{a_n}) の合計を計算します。
これはゼロからの非常に単純な実装です (少なくとも最小限のテスト済み):
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 の場合にクラッシュせずに実行したい場合は、そのためのケースを追加する必要があります:)