mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 17:10:50 +00:00
Handle infinite explicitly in createStringObjectFromLongLong().
This commit is contained in:
parent
92c5ab4029
commit
3632026210
26
src/object.c
26
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
|
/* 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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user