Ошибка в алгоритме нахождения коэффициента корреляции Пирсона
Написал следующий код на c++ для нахождения коэффициента корреляции между двумя численными векторами с любым типом чисел. В результате выполнения для идентичных последовательностей получаю 1. Для теста, приведенного в коде получил значение, превышающее 1, хотя коэф. должен находиться в диапазоне от -1 до 1.
#include <iostream>
#include <vector>
#include <cmath>
#include <exception>
using namespace std;
template<typename num>
float corrcoef(vector<num> arr1, vector<num> arr2)
{
if (arr1.size() != arr2.size()) {
throw invalid_argument("Vectors must have simular length");
}
int size = arr1.size();
int sum1 = 0, sum2 = 0, sum12 = 0;
int pow2sum1 = 0, pow2sum2 = 0;
for (int i = 0; i < size; i++) {
sum1 += arr1[i]; sum2 += arr2[i];
sum12 += arr1[i] * arr2[i];
pow2sum1 += pow(arr1[i], 2);
pow2sum2 += pow(arr2[i], 2);
}
return (size * sum12 - sum1 * sum2) / sqrt((size * pow2sum1 - pow(sum1, 2)) * (size * pow2sum2 - pow(sum2, 2)));
}
int main()
{
vector<float> a = { 0.5, 1, 1.5 };
vector<float> b = { 1, 3, 5 };
cout << corrcoef(a, b);
}
В чем моя ошибка?
Источник: Stack Overflow на русском