Efficient way to compute geometric mean of many numbers
I need to compute the geometric mean of a large set of numbers, whose values are not a priori limited. The naive way would be 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()); } However, this may well fail because of underflow or overflow in the accumulated product (note: long double doesn't really avoid this problem). So, the next option is to sum-up the logarithms: double geometric_mean(std::vector<double> const&data) { auto sumlog = 0.0; for(auto x:data) sum_log += std::log(x);