details: http://hg.nginx.org/njs/rev/9f0f13857c46 branches: changeset: 265:9f0f13857c46 user: Valentin Bartenev <vb...@nginx.com> date: Sat Nov 19 22:20:06 2016 +0300 description: Optimized conversion of negative numbers to integer.
There is no reason to use fmod() for all negative numbers. The numbers in range [-2^53, 2^53] can be converted directly to int64_t. diffstat: njs/njs_number.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) diffs (27 lines): diff -r 91dc07616b19 -r 9f0f13857c46 njs/njs_number.c --- a/njs/njs_number.c Sat Nov 19 22:20:06 2016 +0300 +++ b/njs/njs_number.c Sat Nov 19 22:20:06 2016 +0300 @@ -749,15 +749,16 @@ njs_number_to_integer(double num) int64_t i64; /* - * ECMAScript 5.1: integer must be modulo 2^32. - * 2^53 is the largest integer number which can be stored in the IEEE-754 - * format and numbers less than 2^53 can be just converted to int64_t - * eliding more expensive fmod() operation. Then the int64 integer is - * truncated to uint32_t. The NaN can be converted to 0x8000000000000000 - * and becomes 0 after truncation. fmod() of the infinity returns NaN. + * ES5.1: integer must be modulo 2^32. + * 2^53 is the largest integer number which can be stored safely + * in the IEEE-754 format and numbers less than 2^53 can be just + * converted to int64_t eliding more expensive fmod() operation. + * Then the int64 integer is truncated to uint32_t. The NaN is + * converted to 0x8000000000000000 and becomes 0 after truncation. + * fmod() of the Infinity returns NaN. */ - if (num < 0 || num > 9007199254740992.0) { + if (fabs(num) > 9007199254740992.0) { i64 = fmod(num, 4294967296.0); } else { _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel