値がアプリオリに制限されていない、多数の数値セットの幾何平均を計算する必要があります。素朴な方法は
double geometric_mean(std::vector<double> const&data) // failure
{
auto product = 1.0;
for(auto x:data) product *= x;
return std::pow(product,1.0/data.size());
}
ただし、これは累積のアンダーフローまたはオーバーフローのために失敗する可能性がありますproduct
(注:long double
この問題を実際に回避するわけではありません)。したがって、次のオプションは対数を合計することです。
double geometric_mean(std::vector<double> const&data)
{
auto sumlog = 0.0;
for(auto x:data) sum_log += std::log(x);
return std::exp(sum_log/data.size());
}
これは機能しますが、すべての要素を呼び出すstd::log()
ため、遅くなる可能性があります。それを避けることはできますか?product
たとえば、累算の指数と仮数 (と同等) を別々に追跡することによって?