diff --git a/src/t_hash.c b/src/t_hash.c index 7da8fb171..c75b391d7 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -596,23 +596,23 @@ void hincrbyCommand(client *c) { } void hincrbyfloatCommand(client *c) { - double value, incr; + long double value, incr; long long ll; robj *o; sds new; unsigned char *vstr; unsigned int vlen; - if (getDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return; + if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return; if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if (hashTypeGetValue(o,c->argv[2]->ptr,&vstr,&vlen,&ll) == C_OK) { if (vstr) { - if (string2d((char*)vstr,vlen,&value) == 0) { + if (string2ld((char*)vstr,vlen,&value) == 0) { addReplyError(c,"hash value is not a float"); return; } } else { - value = (double)ll; + value = (long double)ll; } } else { value = 0; diff --git a/src/util.c b/src/util.c index c734b1b6d..c1494e021 100644 --- a/src/util.c +++ b/src/util.c @@ -426,9 +426,9 @@ int string2l(const char *s, size_t slen, long *lval) { * Note that this function demands that the string strictly represents * a double: no spaces or other characters before or after the string * representing the number are accepted. */ -int string2d(const char *s, size_t slen, double *dp) { +int string2ld(const char *s, size_t slen, long double *dp) { char buf[256]; - double value; + long double value; char *eptr; if (slen >= sizeof(buf)) return 0; @@ -436,7 +436,7 @@ int string2d(const char *s, size_t slen, double *dp) { buf[slen] = '\0'; errno = 0; - value = strtod(buf, &eptr); + value = strtold(buf, &eptr); if (isspace(buf[0]) || eptr[0] != '\0' || (errno == ERANGE && (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) || diff --git a/src/util.h b/src/util.h index d28049eaf..d7784495b 100644 --- a/src/util.h +++ b/src/util.h @@ -41,7 +41,7 @@ uint32_t sdigits10(int64_t v); int ll2string(char *s, size_t len, long long value); int string2ll(const char *s, size_t slen, long long *value); int string2l(const char *s, size_t slen, long *value); -int string2d(const char *s, size_t slen, double *dp); +int string2ld(const char *s, size_t slen, long double *dp); int d2string(char *buf, size_t len, double value); int ld2string(char *buf, size_t len, long double value, int humanfriendly); sds getAbsolutePath(char *filename);