Handle infinite explicitly in createStringObjectFromLongLong().

This commit is contained in:
antirez 2014-12-03 10:33:00 +01:00
parent 92c5ab4029
commit 3632026210

View File

@ -111,18 +111,30 @@ robj *createStringObjectFromLongLong(long long value) {
/* Create a string object from a long double. If humanfriendly is non-zero /* 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, * 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 * however this results in loss of precision. Otherwise exp format is used
* and the output of snprintf() is not modified. */ * and the output of snprintf() is not modified.
*
* The 'humanfriendly' option is used for INCRBYFLOAT and HINCRBYFLOAT. */
robj *createStringObjectFromLongDouble(long double value, int humanfriendly) { robj *createStringObjectFromLongDouble(long double value, int humanfriendly) {
char buf[256]; char buf[256];
int len; int len;
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 /* 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 * after rounding is able to represent most small decimal numbers in a
* that is "non surprising" for the user (that is, most small decimal * way that is "non surprising" for the user (that is, most small
* numbers will be represented in a way that when converted back into * decimal numbers will be represented in a way that when converted
* a string are exactly the same as what the user typed.) */ * back into a string are exactly the same as what the user typed.) */
if (humanfriendly) {
len = snprintf(buf,sizeof(buf),"%.17Lf", value); len = snprintf(buf,sizeof(buf),"%.17Lf", value);
/* Now remove trailing zeroes after the '.' */ /* Now remove trailing zeroes after the '.' */
if (strchr(buf,'.') != NULL) { if (strchr(buf,'.') != NULL) {