From fe24458996667f1ee8eac6ab899cdd63f3c5dc22 Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 13 May 2010 10:28:00 +0200 Subject: [PATCH] Yet another version of the double saving code, with comments explaining what's happening there --- redis.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/redis.c b/redis.c index fc921aeb..7964cdfb 100644 --- a/redis.c +++ b/redis.c @@ -3513,7 +3513,18 @@ static int rdbSaveDoubleValue(FILE *fp, double val) { len = 1; buf[0] = (val < 0) ? 255 : 254; } else { - if (val > LLONG_MAX && val < LLONG_MIN && val == ((long long)val)) + /* Check if the float is in a safe range to be casted into a + * long long. We are assuming that long long is 64 bit here. + * Also we are assuming that there are no implementations around where + * double has precision < 52 bit. + * + * Under this assumptions we test if a double is inside an interval + * where casting to long long is safe. Then using two castings we + * make sure the decimal part is zero. If all this is true we use + * integer printing function that is much faster. */ + double min = -4503599627370495; + double max = 4503599627370496; + if (val > min && val < max && val == ((double)((long long)val))) ll2string((char*)buf+1,sizeof(buf),(long long)val); else snprintf((char*)buf+1,sizeof(buf)-1,"%.17g",val); -- GitLab