at v3.8 57 lines 984 B view raw
1#include <math.h> 2 3#include "stat.h" 4 5void update_stats(struct stats *stats, u64 val) 6{ 7 double delta; 8 9 stats->n++; 10 delta = val - stats->mean; 11 stats->mean += delta / stats->n; 12 stats->M2 += delta*(val - stats->mean); 13} 14 15double avg_stats(struct stats *stats) 16{ 17 return stats->mean; 18} 19 20/* 21 * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance 22 * 23 * (\Sum n_i^2) - ((\Sum n_i)^2)/n 24 * s^2 = ------------------------------- 25 * n - 1 26 * 27 * http://en.wikipedia.org/wiki/Stddev 28 * 29 * The std dev of the mean is related to the std dev by: 30 * 31 * s 32 * s_mean = ------- 33 * sqrt(n) 34 * 35 */ 36double stddev_stats(struct stats *stats) 37{ 38 double variance, variance_mean; 39 40 if (!stats->n) 41 return 0.0; 42 43 variance = stats->M2 / (stats->n - 1); 44 variance_mean = variance / stats->n; 45 46 return sqrt(variance_mean); 47} 48 49double rel_stddev_stats(double stddev, double avg) 50{ 51 double pct = 0.0; 52 53 if (avg) 54 pct = 100.0 * stddev/avg; 55 56 return pct; 57}