我希望将总数累积为双倍而非浮动。
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];
}
仅使用标准库。
我知道这不足以保持精确度。
答案 0 :(得分:3)
std::accumulate
中使用的累积类型是从第三个参数的类型推导出来的。文字0.0
是double
,因此使用double
执行累积,而无需显式转换:
double total = std::accumulate(v.begin(), v.end(), 0.0);
相当于
double sum = 0.0;
for (f : v) sum += f;
答案 1 :(得分:2)
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first) {
init = init + *first;
}
return init;
}
返回值的类型由第三个参数决定,它与其他两个参数无关,所以第一个累积应该没问题。
也许你可以对它进行测试,以确认它能否保持精度。