Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
672b0a1b
Commit
672b0a1b
authored
Mar 08, 2011
by
Pieter Noordhuis
Browse files
Fast conversion of double when representable as long long
parent
45290ad9
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/redis.h
View file @
672b0a1b
...
@@ -887,6 +887,7 @@ int stringmatchlen(const char *pattern, int patternLen,
...
@@ -887,6 +887,7 @@ int stringmatchlen(const char *pattern, int patternLen,
int
stringmatch
(
const
char
*
pattern
,
const
char
*
string
,
int
nocase
);
int
stringmatch
(
const
char
*
pattern
,
const
char
*
string
,
int
nocase
);
long
long
memtoll
(
const
char
*
p
,
int
*
err
);
long
long
memtoll
(
const
char
*
p
,
int
*
err
);
int
ll2string
(
char
*
s
,
size_t
len
,
long
long
value
);
int
ll2string
(
char
*
s
,
size_t
len
,
long
long
value
);
int
d2string
(
char
*
s
,
size_t
len
,
double
value
);
int
isStringRepresentableAsLong
(
sds
s
,
long
*
longval
);
int
isStringRepresentableAsLong
(
sds
s
,
long
*
longval
);
int
isStringRepresentableAsLongLong
(
sds
s
,
long
long
*
longval
);
int
isStringRepresentableAsLongLong
(
sds
s
,
long
long
*
longval
);
int
isObjectRepresentableAsLongLong
(
robj
*
o
,
long
long
*
llongval
);
int
isObjectRepresentableAsLongLong
(
robj
*
o
,
long
long
*
llongval
);
...
...
src/util.c
View file @
672b0a1b
#include "redis.h"
#include "redis.h"
#include <ctype.h>
#include <ctype.h>
#include <limits.h>
#include <limits.h>
#include <math.h>
/* Glob-style pattern matching. */
/* Glob-style pattern matching. */
int
stringmatchlen
(
const
char
*
pattern
,
int
patternLen
,
int
stringmatchlen
(
const
char
*
pattern
,
int
patternLen
,
...
@@ -200,6 +201,45 @@ int ll2string(char *s, size_t len, long long value) {
...
@@ -200,6 +201,45 @@ int ll2string(char *s, size_t len, long long value) {
return
l
;
return
l
;
}
}
/* Convert a double to a string representation. Returns the number of bytes
* required. The representation should always be parsable by stdtod(3). */
int
d2string
(
char
*
buf
,
size_t
len
,
double
value
)
{
if
(
isnan
(
value
))
{
len
=
snprintf
(
buf
,
len
,
"nan"
);
}
else
if
(
isinf
(
value
))
{
if
(
value
<
0
)
len
=
snprintf
(
buf
,
len
,
"-inf"
);
else
len
=
snprintf
(
buf
,
len
,
"inf"
);
}
else
if
(
value
==
0
)
{
/* See: http://en.wikipedia.org/wiki/Signed_zero, "Comparisons". */
if
(
1
.
0
/
value
<
0
)
len
=
snprintf
(
buf
,
len
,
"-0"
);
else
len
=
snprintf
(
buf
,
len
,
"0"
);
}
else
{
#if (DBL_MANT_DIG >= 52) && (LLONG_MAX == 0x7fffffffffffffffLL)
/* 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
;
/* (2^52)-1 */
double
max
=
4503599627370496
;
/* -(2^52) */
if
(
val
>
min
&&
val
<
max
&&
value
==
((
double
)((
long
long
)
value
)))
len
=
ll2string
(
buf
,
len
,(
long
long
)
value
);
else
#endif
len
=
snprintf
(
buf
,
len
,
"%.17g"
,
value
);
}
return
len
;
}
/* Check if the sds string 's' can be represented by a long long
/* Check if the sds string 's' can be represented by a long long
* (that is, is a number that fits into long without any other space or
* (that is, is a number that fits into long without any other space or
* character before or after the digits, so that converting this number
* character before or after the digits, so that converting this number
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment