Rでいうところの
> sum(1:10 / sum(1:10)) [1] 1
という感じで、全部足すと1になるように正規化したいんですが、C++でうまくいかない。
/Users/syou6162/cpp% ./a.out The sum is 9.9999999999809e-01 The sum is not 1.0
以下ソース。
#include <iostream> #include <vector> #include <boost/foreach.hpp> using namespace std; std::vector<double> normalize_vector(const std::vector<double>& v) { double sum = 0.0; std::vector<double> result; BOOST_FOREACH(double d, v) { sum += d; } BOOST_FOREACH(double d, v) { result.push_back(d / sum); } return result; } int main(int argc, char *argv[]) { vector<double> tmp; for (int i = 0; i < 100000; i++) { tmp.push_back(2.49148741798853211e-06); } vector<double> v = normalize_vector(tmp); double sum = 0.0; BOOST_FOREACH(double d, v) { sum += d; } if(-1.0e-13 > 1.0 - sum || 1.0e-13 < 1.0 - sum) { fprintf(stderr, "The sum is %15.13e\n", sum); fprintf(stderr, "The sum is not 1.0\n"); } }