/************************************************************************ tstats.h -- template implementation of statistical calculation tools with few exceptions, template stat functions use local long doubles for maximum accuracy; therefore, all clases using TSTATS must have a valid (long double) cast ************************************************************************/ #include <math.h> //for powl() and sqrtl() functions template <class T> T maxof(const T data[], const unsigned n) { return data[indexofmax(data, n)]; } template <class T> unsigned indexofmax(const T data[], const unsigned n) { T max = data[0]; unsigned index = 0; for (unsigned i = 1; i < n; i++) { if (max < data[i]) { max = data[i]; index = i; } } return index; } template <class T> long double average(const T data[], const unsigned n) { long double result, total = 0.0L; for (int i = 0; i < n; i++) total += (long double)data[i]; if (n > 0) { result = total / (long double)n; return result; } else return -1.0L; //covers div by 0 error } template <class T> T stdevs(const T data[], const unsigned n) { long double avg, result, sum = 0; avg = average(data, n); for (int i = 0; i < n; i++) sum += powl((long double)(data[i] - avg),2); if (n > 1) { result = sum/(long double)(n - 1); //n-1 for sample deviation result = sqrtl(result); return (T)result; } else return -1; //covers div by 0 error }