So, if this is the container we are working with:
for(int i = 0; i < 10; ++i)
vd.push_back(1.34 + i * 0.11);
We'll write something like:
double sum = std::accumulate(vd.begin(), vd.end(), 0.0);
std::cout << "Sum is: " << sum << std::endl;
Where the stress is on the fact that the third parameter of accumulate() is 0.0, a double, and not 0, a simple int.
If we want to get the product of all the elements in the sequence, we use the overload of accumulate() that requires a predicate as last parameter, and we pass it an instance of the standard functor multiplies - in this case specifying double as underlying type:
double prod = std::accumulate(vd.begin(), vd.end(), 1.0, std::multiplies<double>());
std::cout << "Product is: " << prod << std::endl;
More info on std::accumulate(), and its (here not even mentioned) relation with for_each(), in Item 37 of Effective STL, one of the Effective C++ book series by Scott Meyers.