xref: /openbmc/linux/tools/perf/util/stat.c (revision ca79522c)
1 #include <math.h>
2 
3 #include "stat.h"
4 
5 void 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 
15 double 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  */
36 double 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 
49 double 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 }
58