Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
stat.c
Go to the documentation of this file.
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 }