static void
add_stats_string(string_t *str, struct stats_dist *stats, const char *name)
{
- str_printfa(str, ", %u %s:%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64,
+ str_printfa(str, ", %u %s:%"PRIu64"/%.02f/%"PRIu64"/%"PRIu64,
stats_dist_get_count(stats), name,
stats_dist_get_min(stats)/1000, stats_dist_get_avg(stats)/1000,
stats_dist_get_95th(stats)/1000, stats_dist_get_max(stats)/1000);
return stats->max;
}
-uint64_t stats_dist_get_avg(const struct stats_dist *stats)
+double stats_dist_get_avg(const struct stats_dist *stats)
{
if (stats->count == 0)
return 0;
- return (stats->sum + stats->count/2) / stats->count;
+ return (double)stats->sum / stats->count;
}
static void stats_dist_ensure_sorted(struct stats_dist *stats)
if (stats->count == 0)
return 0;
- double avg = (double)(int64_t)stats_dist_get_avg(stats);
+ double avg = stats_dist_get_avg(stats);
double count = (stats->count < stats->sample_count)
? stats->count
: stats->sample_count;
/* Returns events' maximum. */
uint64_t stats_dist_get_max(const struct stats_dist *stats);
/* Returns events' average. */
-uint64_t stats_dist_get_avg(const struct stats_dist *stats);
+double stats_dist_get_avg(const struct stats_dist *stats);
/* Returns events' approximate (through random subsampling) median. */
uint64_t stats_dist_get_median(const struct stats_dist *stats);
/* Returns events' variance */
#include "test-lib.h"
#include "stats-dist.h"
#include "sort.h"
+#include "math.h"
+
+#define DBL_EQ(a, b) (fabs((a)-(b)) < 0.001)
static void
test_stats_dist_verify(const struct stats_dist *t, const int64_t *input,
test_assert_idx(stats_dist_get_sum(t) == sum, input_size);
test_assert_idx(stats_dist_get_min(t) == min, input_size);
test_assert_idx(stats_dist_get_max(t) == max, input_size);
- test_assert_idx(stats_dist_get_avg(t) == (sum + input_size/2)/input_size, input_size);
+ test_assert_idx(DBL_EQ(stats_dist_get_avg(t), (double)sum/input_size),
+ input_size);
/* these aren't always fully accurate: */
test_assert_idx(stats_dist_get_median(t) >= copy[(input_size-1)/2] &&
test_assert(stats_dist_get_sum(t) == (i-1)*i/2);
test_assert(stats_dist_get_min(t) == 0);
test_assert(stats_dist_get_max(t) == i-1);
- test_assert(stats_dist_get_avg(t) == i/2);
+ test_assert(DBL_EQ(stats_dist_get_avg(t), 4999.500000));
/* just test that these work: */
test_assert(stats_dist_get_median(t) > 0 && stats_dist_get_median(t) < i-1);
test_assert(stats_dist_get_95th(t) > 0 && stats_dist_get_95th(t) < i-1);
else if (strcmp(field, "max") == 0)
str_printfa(str, "%"PRIu64, stats_dist_get_max(stats));
else if (strcmp(field, "avg") == 0)
- str_printfa(str, "%"PRIu64, stats_dist_get_avg(stats));
+ str_printfa(str, "%.02f", stats_dist_get_avg(stats));
else if (strcmp(field, "median") == 0)
str_printfa(str, "%"PRIu64, stats_dist_get_median(stats));
else if (strcmp(field, "variance") == 0)