1

ソフトマックス操作を実行する必要があります。つまり、n-inf から +inf までの範囲の実数値のシーケンスが与えられた場合、各値を指数化し、指数の合計で除算することにより、それらを確率に変換します。

for (i = 0; i < n; i++)
    p_x[i] = exp(x[i]) / sum_exp(x, n)

(コードを文字通りに解釈しないでください。すべてexpの反復を合計しているわけではありません!)

いくつかの極端なケース (8 バイトの double を使用) で値が 700 を超えると、オーバーフローの問題が発生します。e の代わりに別の基数を使用できることはわかっていますが、呼び出しpowがはるかに遅くなることが心配ですexp(速度は私にとって重要です)。

これを解決する最速の方法は何ですか?

4

2 に答える 2

0

各数値を 64 ビット浮動小数点数の 52 ビット仮数として使用します。これは単にマスキングしてからキャストするだけの問題です。

#include <stdio.h>

int main(int argc, char *argv[])
{
  long long val = 1234567890;
  long long mval = val & ~0xfff0000000000000ULL;
  float fval = *((float*)&mval);
  printf("%f", fval);
}
于 2012-10-16T04:12:21.587 に答える
0
b^x = e^(x * ln b)

したがって、より小さい基数を使用することは、 を適用する前に値を で乗算し、最後に再度除算することbと同じです。ln bexp

于 2012-10-16T19:30:00.217 に答える