私は最近、注文統計の確率分布を扱っています。その領域では、実際の間隔 [0, 1] からの数値の累乗が大きい数式が多数見られるのはよくあることです。
a ~ b ~ 0 の数字を考えてみましょう。どちらも正です。a^n / b^m のようなものを計算したいのですが、n、m は巨大な数です。
私の質問は次のとおりです。次のようなCコードを使用する場合
double f(double a, double b, long m, long n)
{
return( pow(a, n) / pow(b, m) );
}
これは安定しますか?ルールは、最初に a^n を評価し、次に b^m を評価してから除算する必要がありますが、a^n または b^m が十分に小さい場合、ゼロまたは NaN になります。代わりに、次のようなことができます
double g(double a, double b, long m, long n)
{
double res;
long i;
res = 1;
for (i = 0; i < min(m, n); ++i)
{
res = res * a / b;
}
if ( n > m )
{
res = res * pow(a, n - m);
} else {
res = res / pow(b, m - n);
}
return( res );
}
このような場合、1) が最適化の対象になるかどうか知っていますか? そうでない場合、迅速かつ安定した評価のためにそのようなケースをどのように処理しますか?