xref: /openbmc/linux/tools/perf/util/stat.c (revision 8c0b9ee8)
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 	if (val > stats->max)
15 		stats->max = val;
16 
17 	if (val < stats->min)
18 		stats->min = val;
19 }
20 
21 double avg_stats(struct stats *stats)
22 {
23 	return stats->mean;
24 }
25 
26 /*
27  * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
28  *
29  *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
30  * s^2 = -------------------------------
31  *                  n - 1
32  *
33  * http://en.wikipedia.org/wiki/Stddev
34  *
35  * The std dev of the mean is related to the std dev by:
36  *
37  *             s
38  * s_mean = -------
39  *          sqrt(n)
40  *
41  */
42 double stddev_stats(struct stats *stats)
43 {
44 	double variance, variance_mean;
45 
46 	if (stats->n < 2)
47 		return 0.0;
48 
49 	variance = stats->M2 / (stats->n - 1);
50 	variance_mean = variance / stats->n;
51 
52 	return sqrt(variance_mean);
53 }
54 
55 double rel_stddev_stats(double stddev, double avg)
56 {
57 	double pct = 0.0;
58 
59 	if (avg)
60 		pct = 100.0 * stddev/avg;
61 
62 	return pct;
63 }
64