使用std :: accumulate添加具有最佳精度的浮点数

时间:2014-03-17 07:20:56

标签: c++ stl

我希望将总数累积为双倍而非浮动。

vector<float> v;
....
double total  = std::accumulate(v.begin(),
                                v.end(),
                                static_cast<double>(0.0));
//This compiles but I am not sure it is doing what I want

...

double total_ = std::accumulate<double>(v.begin(),
                                        v.end(),
                                        static_cast<double>(0.0)
                                       );

// This doesnt compile, which leads me to believe the first accumulate
// is coercing the double(0.0) back to float.

是否有STL惯用和简洁的方式来编写

double total = 0.0;
for (int i = 0; i < v.size(); ++i) {
  total += v[i];
}

仅使用标准库。

我知道这不足以保持精确度。

2 个答案:

答案 0 :(得分:3)

std::accumulate中使用的累积类型是从第三个参数的类型推导出来的。文字0.0double,因此使用double执行累积,而无需显式转换:

double total  = std::accumulate(v.begin(), v.end(), 0.0);

相当于

double sum = 0.0;
for (f : v) sum += f;

答案 1 :(得分:2)

以下是cppreference.com

的可能实施方式
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first) {
        init = init + *first;
    }
    return init;
}

返回值的类型由第三个参数决定,它与其他两个参数无关,所以第一个累积应该没问题。

也许你可以对它进行测试,以确认它能否保持精度。