fixed formatting

This commit is contained in:
Krishna Vedala
2020-05-23 19:51:18 -04:00
parent e8a0bf2c2c
commit e5d3316ef2

View File

@@ -5,102 +5,94 @@
* continuous mean and variance computance using * continuous mean and variance computance using
* first value as an approximation for the mean * first value as an approximation for the mean
**/ **/
template <typename T> class stats_computer1 template <typename T>
{ class stats_computer1 {
public: public:
void new_val(T x) void new_val(T x) {
{ if (n == 0) K = x;
if (n == 0) n++;
K = x; T tmp = x - K;
n++; Ex += tmp;
T tmp = x - K; Ex2 += tmp * tmp;
Ex += tmp; }
Ex2 += tmp * tmp;
}
double mean() const { return K + Ex / n; } double mean() const { return K + Ex / n; }
double variance() const { return (Ex2 - (Ex * Ex) / n) / (n - 1); } double variance() const { return (Ex2 - (Ex * Ex) / n) / (n - 1); }
double std() const { return std::sqrt(this->variance()); } double std() const { return std::sqrt(this->variance()); }
friend std::istream &operator>>(std::istream &input, stats_computer1 &stat) friend std::istream &operator>>(std::istream &input, stats_computer1 &stat) {
{ T val;
T val; input >> val;
input >> val; stat.new_val(val);
stat.new_val(val); return input;
return input; }
}
private: private:
unsigned int n = 0; unsigned int n = 0;
double Ex, Ex2; double Ex, Ex2;
T K; T K;
}; };
/** /**
* continuous mean and variance computance using * continuous mean and variance computance using
* Welford's algorithm * Welford's algorithm
**/ **/
template <typename T> class stats_computer2 template <typename T>
{ class stats_computer2 {
public: public:
void new_val(T x) void new_val(T x) {
{ n++;
n++; double delta = x - mu;
double delta = x - mu; mu += delta / n;
mu += delta / n; double delta2 = x - mu;
double delta2 = x - mu; M += delta * delta2;
M += delta * delta2; }
}
double mean() const { return mu; } double mean() const { return mu; }
double variance() const { return M / n; } double variance() const { return M / n; }
double std() const { return std::sqrt(this->variance()); } double std() const { return std::sqrt(this->variance()); }
friend std::istream &operator>>(std::istream &input, stats_computer2 &stat) friend std::istream &operator>>(std::istream &input, stats_computer2 &stat) {
{ T val;
T val; input >> val;
input >> val; stat.new_val(val);
stat.new_val(val); return input;
return input; }
}
private: private:
unsigned int n = 0; unsigned int n = 0;
double mu = 0, var = 0, M = 0; double mu = 0, var = 0, M = 0;
}; };
int main(int argc, char **argv) int main(int argc, char **argv) {
{ std::cout << "Enter data. Any non-numeric data will terminate the data input."
std::cout << std::endl;
<< "Enter data. Any non-numeric data will terminate the data input."
<< std::endl;
stats_computer1<double> stats1; stats_computer1<double> stats1;
stats_computer2<double> stats2; stats_computer2<double> stats2;
while (1) while (1) {
{ double val;
double val; std::cout << "Enter number: ";
std::cout << "Enter number: "; std::cin >> val;
std::cin >> val; if (std::cin.fail()) // check for failure to read input. Happens for
if (std::cin.fail()) // check for failure to read input. Happens for // non-numeric data
// non-numeric data break;
break; stats1.new_val(val);
stats1.new_val(val); stats2.new_val(val);
stats2.new_val(val); std::cout << "\tMethod 1:"
std::cout << "\tMethod 1:" << "\tMean: " << stats1.mean()
<< "\tMean: " << stats1.mean() << "\t Variance: " << stats1.variance()
<< "\t Variance: " << stats1.variance() << "\t Std: " << stats1.std() << std::endl;
<< "\t Std: " << stats1.std() << std::endl; std::cout << "\tMethod 2:"
std::cout << "\tMethod 2:" << "\tMean: " << stats2.mean()
<< "\tMean: " << stats2.mean() << "\t Variance: " << stats2.variance()
<< "\t Variance: " << stats2.variance() << "\t Std: " << stats2.std() << std::endl;
<< "\t Std: " << stats2.std() << std::endl; }
}
return 0; return 0;
} }