From 11900b10a3c2be86f90b6cbb085295683dd357f4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 15 Sep 2008 11:47:03 +0000 Subject: [PATCH] Fixed bug #43053 (Regression: some numbers shown in scientific notation). (int-e at gmx dot de) some 64bit test files may need to be fixed --- NEWS | 2 ++ Zend/tests/bug43053.phpt | 14 ++++++++++++++ Zend/tests/hex_overflow_32bit.phpt | 2 +- Zend/tests/zend_strtod.phpt | 2 +- Zend/zend_strtod.c | 9 +-------- ext/standard/tests/general_functions/008.phpt | 2 +- ext/standard/tests/strings/printf.phpt | 16 ++++++++-------- main/snprintf.c | 5 +---- 8 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 Zend/tests/bug43053.phpt diff --git a/NEWS b/NEWS index 9cc9e81a13..7850aec94e 100644 --- a/NEWS +++ b/NEWS @@ -116,6 +116,8 @@ PHP NEWS - Fixed bug #43666 (Fixed code to use ODBC 3.52 datatypes for 64bit systems). (Patrick) - Fixed bug #43540 (rfc1867 handler newlength problem). (Arnaud) +- Fixed bug #43053 (Regression: some numbers shown in scientific notation). + (int-e at gmx dot de) - Fixed bug #42737 (preg_split('//u') triggers a E_NOTICE with newlines). (Nuno) - Fixed bug #42604 ("make test" fails with --with-config-file-scan-dir=path). diff --git a/Zend/tests/bug43053.phpt b/Zend/tests/bug43053.phpt new file mode 100644 index 0000000000..646aa97d0b --- /dev/null +++ b/Zend/tests/bug43053.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #43053 (Regression: some numbers shown in scientific notation) +--FILE-- + +--EXPECT-- +1200000 +1300000 +1400000 +1500000 diff --git a/Zend/tests/hex_overflow_32bit.phpt b/Zend/tests/hex_overflow_32bit.phpt index 36e9a7e9d3..0f192f3497 100644 --- a/Zend/tests/hex_overflow_32bit.phpt +++ b/Zend/tests/hex_overflow_32bit.phpt @@ -22,7 +22,7 @@ foreach ($doubles as $d) { echo "Done\n"; ?> --EXPECTF-- -float(4083360297110%d) +float(4.0833602971%dE+14) float(4.7223664828%dE+21) float(1.3521606402%dE+31) float(1.9807040628%dE+27) diff --git a/Zend/tests/zend_strtod.phpt b/Zend/tests/zend_strtod.phpt index 1b11be0388..7f4bca5966 100644 --- a/Zend/tests/zend_strtod.phpt +++ b/Zend/tests/zend_strtod.phpt @@ -15,5 +15,5 @@ echo "Done\n"; float(-100) float(808792757210) float(-4.5646456464565E+27) -float(-11276204760067000) +float(-1.1276204760067E+16) Done diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c index cb5ef58ba1..bb93d7b6b1 100644 --- a/Zend/zend_strtod.c +++ b/Zend/zend_strtod.c @@ -1720,14 +1720,7 @@ ZEND_API char * zend_dtoa(double _d, int mode, int ndigits, int *decpt, int *sig if (value(d) > 0.5 + value(eps)) goto bump_up; else if (value(d) < 0.5 - value(eps)) { - /* cut ALL traling zeros only if the number of chars is greater than precision - * otherwise cut only extra zeros - */ - if (k < ndigits) { - while(*--s == '0' && (s - s0) > k); - } else { - while(*--s == '0'); - } + while(*--s == '0'); s++; goto ret1; } diff --git a/ext/standard/tests/general_functions/008.phpt b/ext/standard/tests/general_functions/008.phpt index bb633c334d..f76c73572b 100644 --- a/ext/standard/tests/general_functions/008.phpt +++ b/ext/standard/tests/general_functions/008.phpt @@ -34,7 +34,7 @@ array(14) { [11]=> float(123456789012) [12]=> - float(1234567890120) + float(1.23456789012E+12) [13]=> float(1.23456789012E+19) } \ No newline at end of file diff --git a/ext/standard/tests/strings/printf.phpt b/ext/standard/tests/strings/printf.phpt index 13a8ed0713..eb72dbfd61 100755 --- a/ext/standard/tests/strings/printf.phpt +++ b/ext/standard/tests/strings/printf.phpt @@ -645,10 +645,10 @@ Array -123456 123456 -123456 -120000 --120000 -+120000 --120000 +1.2e+5 +-1.2e+5 ++1.2e+5 +-1.2e+5 123456 -123456 1.0E+5 @@ -657,10 +657,10 @@ Array -123456 123456 -123456 -120000 --120000 -+120000 --120000 +1.2E+5 +-1.2E+5 ++1.2E+5 +-1.2E+5 *** Output for '%%%.2f' as the format parameter *** %12345678900.00 diff --git a/main/snprintf.c b/main/snprintf.c index d42722c79b..9767241266 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -155,10 +155,7 @@ PHPAPI char *php_gcvt(double value, int ndigit, char dec_point, char exponent, c *dst++ = '-'; } - for (i = 0; i < ndigit && digits[i] != '\0'; i++); - - if ((decpt >= 0 && decpt - i > 4) - || (decpt < 0 && decpt < -3)) { /* use E-style */ + if ((decpt >= 0 && decpt > ndigit) || decpt < -3) { /* use E-style */ /* exponential format (e.g. 1.2345e+13) */ if (--decpt < 0) { sign = 1; -- 2.50.1