Commit | Line | Data |
---|---|---|
0007ecea XG |
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 | } |