ちょっと相乗平均(幾何平均)を求める必要があったのだが
最初は脳死で定義通りのプログラムを書いた
※例のコードでは空配列の考慮は省略
template<class R> double GeometricMean(const R& ar) { double product = 1; for (const auto& v : ar) { product *= v; } return std::pow(product, 1.0 / std::size(ar)); }
まぁ問題はない。
のだけど、データセットの数値感が大きかったので一瞬でオーバーフローしちゃった
100~200程度の数が数百個あったので…
そこでジョンネイピアに感謝しながら対数を使うことで小さい足し算にして計算した
template<class R> double GeometricMean(const R& ar) { double logSum = 0; for (const auto& v : ar) { logSum += std::log(v); } return std::exp(logSum / std::size(ar)); }
対数の発見は偉大過ぎると思いました。
ありがとう。ジョンネイピア。