从整数向量中获取平均值

dim*_*s93 7 c++ vector

我一直无法找到一种从C++中的整数向量中获取平均值的方法.

我不可能开始添加所有值,因为我可以超过最大整数接受值.

如何有效,快速地计算出来?C++语言中是否有标准库可以做到这一点?

Bar*_*rry 25

首选方法只是用足够宽的整数类型求和std::accumulate:

double avg1(std::vector<int> const& v) {
    return 1.0 * std::accumulate(v.begin(), v.end(), 0LL) / v.size();
}
Run Code Online (Sandbox Code Playgroud)

如果这个总和溢出(2300万英镑,平均值必须至少4.01x10 11 - 也就是说,它不会溢出,因为它甚至不适合int32_t...所以你很好,但是如果你得到几个数量级的数字,或者有更宽的int类型),那么你可以使用常见的"在线"算法来计算平均值:

double avg2(std::vector<int> const& v) {
    int n = 0;
    double mean = 0.0;
    for (auto x : v) {
        double delta = x - mean;
        mean += delta/++n;
    }
    return mean;
}
Run Code Online (Sandbox Code Playgroud)

这不会溢出,不是很容易失去精度,但由于重复的额外划分可能会更昂贵.

  • @CaptainGiraffe - 想象一个带有2 ^ 53个条目的向量,每个值为"1"(也可以提供需要更少条目的示例......) (2认同)
  • @CaptainGiraffe - 确实!但说明了问题 - 一旦输入值低于累加器的ULP,它们就没有贡献. (2认同)