Ниже предполагается, что ваши данные с плавающей запятой. Если вместо этого у вас целочисленные значения, укажите ваши требования.
Чистый числовой способ - это, конечно, сначала взять журнал. Действительно, частичные продукты могут легко потеряться / переполниться, даже если результат конечен.
Идиоматическая соответствующая программа на C ++:
#include <cmath>
#include <functional>
#include <numeric>
double f(double x, double y)
{
return y * std::log(x);
}
template <typename I, typename J>
double multi_exponentiation(I a0, I an, J b0)
{
return std::exp(std::inner_product(a0, an, b0, 0., std::plus<double>(), f));
}
// Example program
int main()
{
std::vector<double> a, b;
...
double e = multi_exponentiation(a.begin(), a.end(), b.begin());
}
Использование inner_product
вместо того, чтобы писать цикл самостоятельно, дает то преимущество, что , когда вы знаете, что производительность является проблемой , вы можете заменить алгоритм inner_product
алгоритмом parallel_inner_product
, предоставленным третьим -партийная библиотека (или напишите ее самостоятельно).