stat.c 984 B

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