From 0224be881124343bd4ad7696848f9fd6c51b11d0 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 16 Dec 2016 10:58:19 +0100 Subject: [PATCH] Use llroundl() before converting loglog-beta output to integer. Otherwise for small cardinalities the algorithm will output something like, for example, 4.99 for a candinality of 5, that will be converted to 4 producing a huge error. --- src/hyperloglog.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 67a92872..6dde6298 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -993,9 +993,9 @@ uint64_t hllCount(struct hllhdr *hdr, int *invalid) { } else { serverPanic("Unknown HyperLogLog encoding in hllCount()"); } - + if(server.hll_use_loglogbeta) { - /* For loglog-beta there is a single formula to compute + /* For loglog-beta there is a single formula to compute * cardinality for the enture range */ @@ -1008,8 +1008,8 @@ uint64_t hllCount(struct hllhdr *hdr, int *invalid) { 0.03738027*pow(zl,5) + -0.005384159*pow(zl,6) + 0.00042419*pow(zl,7); - - E = alpha*m*(m-ez)*(1/(E+beta)); + + E = llroundl(alpha*m*(m-ez)*(1/(E+beta))); } else { /* Muliply the inverse of E for alpha_m * m^2 to have the raw estimate. */ E = (1/E)*alpha*m*m;