]> granicus.if.org Git - php/commitdiff
Fixed bug #43053 (Regression: some numbers shown in scientific notation). (int-e...
authorDmitry Stogov <dmitry@php.net>
Mon, 15 Sep 2008 11:47:27 +0000 (11:47 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 15 Sep 2008 11:47:27 +0000 (11:47 +0000)
some 64bit test files may need to be fixed

Zend/tests/bug43053.phpt [new file with mode: 0644]
Zend/tests/hex_overflow_32bit.phpt
Zend/tests/zend_strtod.phpt
Zend/zend_strtod.c
ext/standard/tests/general_functions/008.phpt
ext/standard/tests/strings/printf.phpt
main/snprintf.c

diff --git a/Zend/tests/bug43053.phpt b/Zend/tests/bug43053.phpt
new file mode 100644 (file)
index 0000000..646aa97
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #43053 (Regression: some numbers shown in scientific notation)
+--FILE--
+<?php
+echo 1200000.00."\n";
+echo 1300000.00."\n";
+echo 1400000.00."\n";
+echo 1500000.00."\n";
+?>
+--EXPECT--
+1200000
+1300000
+1400000
+1500000
index eae789f267a43176b882ea48b24a57f5278b2872..529757dd56d96a468cc2b0e9a3c742a1bf9056c9 100644 (file)
@@ -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)
index f3e9789a0a7cebe3c2475af2d11b85674e662740..4530ce2e8ce5c38d78770c0c069f10741fe6a221 100644 (file)
@@ -15,5 +15,5 @@ echo "Done\n";
 float(-100)
 float(808792757210)
 float(-4.5646456464565E+27)
-float(-11276204760067000)
+float(-1.1276204760067E+16)
 Done
index d42350c66ffaa24499e99c986b20df7a2b08001a..473c6f2bbcd85693faac646ffa30fa40ee0eb2ff 100644 (file)
@@ -1732,14 +1732,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;
                                        }
index d021073ad8edff5f389da87fec32fd8cbd6fc4c9..ba0a97fe43348b10d5d2dc2b25ba4bf9b43bf220 100644 (file)
@@ -34,7 +34,7 @@ array(14) {
   [11]=>
   float(123456789012)
   [12]=>
-  float(1234567890120)
+  float(1.23456789012E+12)
   [13]=>
   float(1.23456789012E+19)
 }
index d2e6143ce1cb202f9889d9e5d27a7be04ce5db38..e18c7720b745a668fb55cc5b272b141bb5e517e5 100755 (executable)
@@ -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
index 3890871c1d227b0eea551a3567a0da65144b40d2..2744a104a5ee15a5f37a85c0207d2ae8cab002da 100644 (file)
@@ -152,9 +152,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;