読者です 読者をやめる 読者になる 読者になる

割合の合計して1にならない

C++

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");
  }
}