diff options
| author | Xinchen Hui <laruence@gmail.com> | 2016-01-21 13:32:08 +0800 |
|---|---|---|
| committer | Xinchen Hui <laruence@gmail.com> | 2016-01-21 13:32:08 +0800 |
| commit | 62f3e5adf88ded51a0112977ff2a269bea58d44d (patch) | |
| tree | 2495016ed4891e9d3eabb9b1cf2621a1740e25f9 /ext/standard/math.c | |
| parent | 62c1c11ad34103729988df9edea343337a900ba9 (diff) | |
| parent | 50c255d16c58b4957077fd243c2768090c53e6ca (diff) | |
| download | php-git-62f3e5adf88ded51a0112977ff2a269bea58d44d.tar.gz | |
Merge branch 'master' of git.php.net:/php-src
* 'master' of git.php.net:/php-src:
re-arrange NEWS
5.6.19 will be next
Fix test when run with openssl < 1.0.2 (reorder so no more SSLv2 message) Fix skip message to work
fix ReflectionClass::__toString doc block omitted
fix ReflectionClass::__toString doc block omitted
improve fix for bug #71201
improve fix for bug #71201
Diffstat (limited to 'ext/standard/math.c')
| -rw-r--r-- | ext/standard/math.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/ext/standard/math.c b/ext/standard/math.c index 7ea8dc1199..ebfee8ead8 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -146,6 +146,7 @@ PHPAPI double _php_math_round(double value, int places, int mode) { return value; } + places = places < INT_MIN+1 ? INT_MIN+1 : places; precision_places = 14 - php_intlog10abs(value); f1 = php_intpow10(abs(places)); @@ -154,8 +155,10 @@ PHPAPI double _php_math_round(double value, int places, int mode) { the requested places BUT is small enough to make sure a non-zero value is returned, pre-round the result to the precision */ if (precision_places > places && precision_places - places < 15) { - f2 = php_intpow10(abs(precision_places)); - if (precision_places >= 0) { + int64_t use_precision = precision_places < INT_MIN+1 ? INT_MIN+1 : precision_places; + + f2 = php_intpow10(abs((int)use_precision)); + if (use_precision >= 0) { tmp_value = value * f2; } else { tmp_value = value / f2; @@ -163,8 +166,11 @@ PHPAPI double _php_math_round(double value, int places, int mode) { /* preround the result (tmp_value will always be something * 1e14, thus never larger than 1e15 here) */ tmp_value = php_round_helper(tmp_value, mode); + + use_precision = places - precision_places; + use_precision = use_precision < INT_MIN+1 ? INT_MIN+1 : use_precision; /* now correctly move the decimal point */ - f2 = php_intpow10(abs(places - precision_places)); + f2 = php_intpow10(abs((int)use_precision)); /* because places < precision_places */ tmp_value = tmp_value / f2; } else { |
