summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-12-03 10:33:00 +0100
committerantirez <antirez@gmail.com>2014-12-03 10:37:01 +0100
commit3632026210817e527508e4b3b98f8cd6837547d3 (patch)
tree62f6ec2f046cb3505277a156b678ccd33aebed34 /src/object.c
parent92c5ab40295260352f0da09616ff15b499251bad (diff)
downloadredis-3632026210817e527508e4b3b98f8cd6837547d3.tar.gz
Handle infinite explicitly in createStringObjectFromLongLong().
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/object.c b/src/object.c
index 2b2d463f6..11c77c3c3 100644
--- a/src/object.c
+++ b/src/object.c
@@ -111,18 +111,30 @@ robj *createStringObjectFromLongLong(long long value) {
/* Create a string object from a long double. If humanfriendly is non-zero
* it does not use exponential format and trims trailing zeroes at the end,
- * however this result in loss of precision. Otherwise exp format is used
- * and the output of snprintf() is not modified. */
+ * however this results in loss of precision. Otherwise exp format is used
+ * and the output of snprintf() is not modified.
+ *
+ * The 'humanfriendly' option is used for INCRBYFLOAT and HINCRBYFLOAT. */
robj *createStringObjectFromLongDouble(long double value, int humanfriendly) {
char buf[256];
int len;
- /* We use 17 digits precision since with 128 bit floats that precision
- * after rounding is able to represent most small decimal numbers in a way
- * that is "non surprising" for the user (that is, most small decimal
- * numbers will be represented in a way that when converted back into
- * a string are exactly the same as what the user typed.) */
- if (humanfriendly) {
+ if (isinf(value)) {
+ /* Libc in odd systems (Hi Solaris!) will format infinite in a
+ * different way, so better to handle it in an explicit way. */
+ if (value > 0) {
+ memcpy(buf,"inf",3);
+ len = 3;
+ } else {
+ memcpy(buf,"-inf",4);
+ len = 4;
+ }
+ } else if (humanfriendly) {
+ /* We use 17 digits precision since with 128 bit floats that precision
+ * after rounding is able to represent most small decimal numbers in a
+ * way that is "non surprising" for the user (that is, most small
+ * decimal numbers will be represented in a way that when converted
+ * back into a string are exactly the same as what the user typed.) */
len = snprintf(buf,sizeof(buf),"%.17Lf", value);
/* Now remove trailing zeroes after the '.' */
if (strchr(buf,'.') != NULL) {