changeset 10458:1cc9cffb9615

Allow 3-digit exponents in %e and %g results on 'long double'.
author Bruno Haible <bruno@clisp.org>
date Sun, 21 Sep 2008 17:17:43 +0200
parents 85455fe7164d
children 2819ac4d82da
files ChangeLog tests/test-snprintf-posix.h tests/test-sprintf-posix.h tests/test-vasnprintf-posix.c tests/test-vasprintf-posix.c
diffstat 5 files changed, 238 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-09-21  Bruno Haible  <bruno@clisp.org>
+
+	* tests/test-vasnprintf-posix.c (test_function): Allow 3-digit
+	exponents in %e and %g results on 'long double'. Needed for mingw's
+	improved *printf functions.
+	* tests/test-vasprintf-posix.c (test_function): Likewise.
+	* tests/test-snprintf-posix.h (test_function): Likewise.
+	* tests/test-sprintf-posix.h (test_function): Likewise.
+	Reported by Eric Blake.
+
 2008-09-21  Bruno Haible  <bruno@clisp.org>
 
 	* tests/test-snprintf-posix.h (test_function): Remove useless ASSERTs.
--- a/tests/test-snprintf-posix.h
+++ b/tests/test-snprintf-posix.h
@@ -1883,7 +1883,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 12.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.275000e+01 33") == 0);
+    ASSERT (strcmp (result, "1.275000e+01 33") == 0
+	    || strcmp (result, "1.275000e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1891,7 +1892,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 1234567.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.234567e+06 33") == 0);
+    ASSERT (strcmp (result, "1.234567e+06 33") == 0
+	    || strcmp (result, "1.234567e+006 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1979,7 +1981,15 @@
 	char result[100];
 	int retval =
 	  my_snprintf (result, sizeof (result), "%Le", data[k].value);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	const char *expected = data[k].string;
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
       }
   }
@@ -1988,7 +1998,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", -0.03125L, 33, 44, 55);
-    ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
+    ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+	    || strcmp (result, "-3.125000e-002 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1996,7 +2007,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 0.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "0.000000e+00 33") == 0);
+    ASSERT (strcmp (result, "0.000000e+00 33") == 0
+	    || strcmp (result, "0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2005,7 +2017,8 @@
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", -zerol, 33, 44, 55);
     if (have_minus_zero ())
-      ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
+      ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+	      || strcmp (result, "-0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2128,7 +2141,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%15Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "   1.750000e+00 33") == 0
+	    || strcmp (result, "  1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2136,7 +2150,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-15Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.750000e+00    33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00    33") == 0
+	    || strcmp (result, "1.750000e+000   33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2144,7 +2159,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+	    || strcmp (result, "+1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2152,7 +2168,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+	    || strcmp (result, " 1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2160,7 +2177,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00 33") == 0
+	    || strcmp (result, "1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2168,7 +2186,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "2.e+00 33") == 0);
+    ASSERT (strcmp (result, "2.e+00 33") == 0
+	    || strcmp (result, "2.e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2176,7 +2195,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Le %d", 9.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2184,7 +2204,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Le %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
+    ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+	    || strcmp (result, "001.234000e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2211,7 +2232,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.Le %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2219,7 +2241,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4Le %d", 999.951L, 33, 44, 55);
-    ASSERT (strcmp (result, "9.9995e+02 33") == 0);
+    ASSERT (strcmp (result, "9.9995e+02 33") == 0
+	    || strcmp (result, "9.9995e+002 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2227,7 +2250,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4Le %d", 999.996L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.0000e+03 33") == 0);
+    ASSERT (strcmp (result, "1.0000e+03 33") == 0
+	    || strcmp (result, "1.0000e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2522,7 +2546,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", 1234567.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.23457e+06 33") == 0);
+    ASSERT (strcmp (result, "1.23457e+06 33") == 0
+	    || strcmp (result, "1.23457e+006 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2610,7 +2635,16 @@
 	char result[100];
 	int retval =
 	  my_snprintf (result, sizeof (result), "%Lg", data[k].value);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	const char *expected = data[k].string;
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (expected[strlen (expected) - 4] == 'e'
+		    && strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
       }
   }
@@ -2807,7 +2841,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Lg %d", 9.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2842,7 +2877,8 @@
     char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.Lg %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
--- a/tests/test-sprintf-posix.h
+++ b/tests/test-sprintf-posix.h
@@ -1869,7 +1869,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 12.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.275000e+01 33") == 0);
+    ASSERT (strcmp (result, "1.275000e+01 33") == 0
+	    || strcmp (result, "1.275000e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1877,7 +1878,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 1234567.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.234567e+06 33") == 0);
+    ASSERT (strcmp (result, "1.234567e+06 33") == 0
+	    || strcmp (result, "1.234567e+006 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1965,7 +1967,15 @@
 	char result[1000];
 	int retval =
 	  my_sprintf (result, "%Le", data[k].value);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	const char *expected = data[k].string;
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
       }
   }
@@ -1974,7 +1984,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", -0.03125L, 33, 44, 55);
-    ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
+    ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+	    || strcmp (result, "-3.125000e-002 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1982,7 +1993,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 0.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "0.000000e+00 33") == 0);
+    ASSERT (strcmp (result, "0.000000e+00 33") == 0
+	    || strcmp (result, "0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -1991,7 +2003,8 @@
     int retval =
       my_sprintf (result, "%Le %d", -zerol, 33, 44, 55);
     if (have_minus_zero ())
-      ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
+      ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+	      || strcmp (result, "-0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2114,7 +2127,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%15Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "   1.750000e+00 33") == 0
+	    || strcmp (result, "  1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2122,7 +2136,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%-15Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.750000e+00    33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00    33") == 0
+	    || strcmp (result, "1.750000e+000   33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2130,7 +2145,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%+Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+	    || strcmp (result, "+1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2138,7 +2154,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "% Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+	    || strcmp (result, " 1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2146,7 +2163,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%#Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00 33") == 0
+	    || strcmp (result, "1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2154,7 +2172,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%#.Le %d", 1.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "2.e+00 33") == 0);
+    ASSERT (strcmp (result, "2.e+00 33") == 0
+	    || strcmp (result, "2.e+000 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2162,7 +2181,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%#.Le %d", 9.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2170,7 +2190,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%015Le %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
+    ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+	    || strcmp (result, "001.234000e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2197,7 +2218,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%.Le %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2205,7 +2227,8 @@
     char result[100];
     int retval =
       my_sprintf (result, "%.4Le %d", 999.951L, 33, 44, 55);
-    ASSERT (strcmp (result, "9.9995e+02 33") == 0);
+    ASSERT (strcmp (result, "9.9995e+02 33") == 0
+	    || strcmp (result, "9.9995e+002 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2213,7 +2236,8 @@
     char result[100];
     int retval =
       my_sprintf (result, "%.4Le %d", 999.996L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.0000e+03 33") == 0);
+    ASSERT (strcmp (result, "1.0000e+03 33") == 0
+	    || strcmp (result, "1.0000e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2508,7 +2532,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", 1234567.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.23457e+06 33") == 0);
+    ASSERT (strcmp (result, "1.23457e+06 33") == 0
+	    || strcmp (result, "1.23457e+006 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2596,7 +2621,16 @@
 	char result[1000];
 	int retval =
 	  my_sprintf (result, "%Lg", data[k].value);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	const char *expected = data[k].string;
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (expected[strlen (expected) - 4] == 'e'
+		    && strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
       }
   }
@@ -2793,7 +2827,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%#.Lg %d", 9.75L, 33, 44, 55);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
@@ -2828,7 +2863,8 @@
     char result[1000];
     int retval =
       my_sprintf (result, "%.Lg %d", 1234.0L, 33, 44, 55);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
   }
 
--- a/tests/test-vasnprintf-posix.c
+++ b/tests/test-vasnprintf-posix.c
@@ -2231,7 +2231,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", 12.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.275000e+01 33") == 0);
+    ASSERT (strcmp (result, "1.275000e+01 33") == 0
+	    || strcmp (result, "1.275000e+001 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2241,7 +2242,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", 1234567.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.234567e+06 33") == 0);
+    ASSERT (strcmp (result, "1.234567e+06 33") == 0
+	    || strcmp (result, "1.234567e+006 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2330,8 +2332,16 @@
 	size_t length;
 	char *result =
 	  my_asnprintf (NULL, &length, "%Le", data[k].value);
+	const char *expected = data[k].string;
 	ASSERT (result != NULL);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (length == strlen (result));
 	free (result);
       }
@@ -2342,7 +2352,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", -0.03125L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
+    ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+	    || strcmp (result, "-3.125000e-002 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2352,7 +2363,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", 0.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "0.000000e+00 33") == 0);
+    ASSERT (strcmp (result, "0.000000e+00 33") == 0
+	    || strcmp (result, "0.000000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2363,7 +2375,8 @@
       my_asnprintf (NULL, &length, "%Le %d", -zerol, 33, 44, 55);
     ASSERT (result != NULL);
     if (have_minus_zero ())
-      ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
+      ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+	      || strcmp (result, "-0.000000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2508,7 +2521,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%15Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "   1.750000e+00 33") == 0
+	    || strcmp (result, "  1.750000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2518,7 +2532,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%-15Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.750000e+00    33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00    33") == 0
+	    || strcmp (result, "1.750000e+000   33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2528,7 +2543,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%+Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+	    || strcmp (result, "+1.750000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2538,7 +2554,8 @@
     char *result =
       my_asnprintf (NULL, &length, "% Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+	    || strcmp (result, " 1.750000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2548,7 +2565,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%#Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00 33") == 0
+	    || strcmp (result, "1.750000e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2558,7 +2576,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%#.Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "2.e+00 33") == 0);
+    ASSERT (strcmp (result, "2.e+00 33") == 0
+	    || strcmp (result, "2.e+000 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2568,7 +2587,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%#.Le %d", 9.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2578,7 +2598,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%015Le %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
+    ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+	    || strcmp (result, "001.234000e+003 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2611,7 +2632,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%.Le %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2621,7 +2643,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%.4Le %d", 999.951L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "9.9995e+02 33") == 0);
+    ASSERT (strcmp (result, "9.9995e+02 33") == 0
+	    || strcmp (result, "9.9995e+002 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2631,7 +2654,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%.4Le %d", 999.996L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.0000e+03 33") == 0);
+    ASSERT (strcmp (result, "1.0000e+03 33") == 0
+	    || strcmp (result, "1.0000e+003 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -2974,7 +2998,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", 1234567.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.23457e+06 33") == 0);
+    ASSERT (strcmp (result, "1.23457e+06 33") == 0
+	    || strcmp (result, "1.23457e+006 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -3063,8 +3088,17 @@
 	size_t length;
 	char *result =
 	  my_asnprintf (NULL, &length, "%Lg", data[k].value);
+	const char *expected = data[k].string;
 	ASSERT (result != NULL);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (expected[strlen (expected) - 4] == 'e'
+		    && strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (length == strlen (result));
 	free (result);
       }
@@ -3301,7 +3335,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%#.Lg %d", 9.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
@@ -3344,7 +3379,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%.Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (length == strlen (result));
     free (result);
   }
--- a/tests/test-vasprintf-posix.c
+++ b/tests/test-vasprintf-posix.c
@@ -2212,7 +2212,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", 12.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.275000e+01 33") == 0);
+    ASSERT (strcmp (result, "1.275000e+01 33") == 0
+	    || strcmp (result, "1.275000e+001 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2222,7 +2223,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", 1234567.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.234567e+06 33") == 0);
+    ASSERT (strcmp (result, "1.234567e+06 33") == 0
+	    || strcmp (result, "1.234567e+006 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2311,8 +2313,16 @@
 	char *result;
 	int retval =
 	  my_asprintf (&result, "%Le", data[k].value);
+	const char *expected = data[k].string;
 	ASSERT (result != NULL);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
 	free (result);
       }
@@ -2323,7 +2333,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", -0.03125L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
+    ASSERT (strcmp (result, "-3.125000e-02 33") == 0
+	    || strcmp (result, "-3.125000e-002 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2333,7 +2344,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", 0.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "0.000000e+00 33") == 0);
+    ASSERT (strcmp (result, "0.000000e+00 33") == 0
+	    || strcmp (result, "0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2344,7 +2356,8 @@
       my_asprintf (&result, "%Le %d", -zerol, 33, 44, 55);
     ASSERT (result != NULL);
     if (have_minus_zero ())
-      ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
+      ASSERT (strcmp (result, "-0.000000e+00 33") == 0
+	      || strcmp (result, "-0.000000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2489,7 +2502,8 @@
     int retval =
       my_asprintf (&result, "%15Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "   1.750000e+00 33") == 0
+	    || strcmp (result, "  1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2499,7 +2513,8 @@
     int retval =
       my_asprintf (&result, "%-15Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.750000e+00    33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00    33") == 0
+	    || strcmp (result, "1.750000e+000   33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2509,7 +2524,8 @@
     int retval =
       my_asprintf (&result, "%+Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "+1.750000e+00 33") == 0
+	    || strcmp (result, "+1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2519,7 +2535,8 @@
     int retval =
       my_asprintf (&result, "% Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, " 1.750000e+00 33") == 0
+	    || strcmp (result, " 1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2529,7 +2546,8 @@
     int retval =
       my_asprintf (&result, "%#Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.750000e+00 33") == 0);
+    ASSERT (strcmp (result, "1.750000e+00 33") == 0
+	    || strcmp (result, "1.750000e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2539,7 +2557,8 @@
     int retval =
       my_asprintf (&result, "%#.Le %d", 1.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "2.e+00 33") == 0);
+    ASSERT (strcmp (result, "2.e+00 33") == 0
+	    || strcmp (result, "2.e+000 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2549,7 +2568,8 @@
     int retval =
       my_asprintf (&result, "%#.Le %d", 9.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2559,7 +2579,8 @@
     int retval =
       my_asprintf (&result, "%015Le %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
+    ASSERT (strcmp (result, "0001.234000e+03 33") == 0
+	    || strcmp (result, "001.234000e+003 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2592,7 +2613,8 @@
     int retval =
       my_asprintf (&result, "%.Le %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2602,7 +2624,8 @@
     int retval =
       my_asprintf (&result, "%.4Le %d", 999.951L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "9.9995e+02 33") == 0);
+    ASSERT (strcmp (result, "9.9995e+02 33") == 0
+	    || strcmp (result, "9.9995e+002 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2612,7 +2635,8 @@
     int retval =
       my_asprintf (&result, "%.4Le %d", 999.996L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.0000e+03 33") == 0);
+    ASSERT (strcmp (result, "1.0000e+03 33") == 0
+	    || strcmp (result, "1.0000e+003 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -2955,7 +2979,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", 1234567.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.23457e+06 33") == 0);
+    ASSERT (strcmp (result, "1.23457e+06 33") == 0
+	    || strcmp (result, "1.23457e+006 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -3044,8 +3069,17 @@
 	char *result;
 	int retval =
 	  my_asprintf (&result, "%Lg", data[k].value);
+	const char *expected = data[k].string;
 	ASSERT (result != NULL);
-	ASSERT (strcmp (result, data[k].string) == 0);
+	ASSERT (strcmp (result, expected) == 0
+		/* Some implementations produce exponents with 3 digits.  */
+		|| (expected[strlen (expected) - 4] == 'e'
+		    && strlen (result) == strlen (expected) + 1
+		    && memcmp (result, expected, strlen (expected) - 2) == 0
+		    && result[strlen (expected) - 2] == '0'
+		    && strcmp (result + strlen (expected) - 1,
+			       expected + strlen (expected) - 2)
+		       == 0));
 	ASSERT (retval == strlen (result));
 	free (result);
       }
@@ -3282,7 +3316,8 @@
     int retval =
       my_asprintf (&result, "%#.Lg %d", 9.75L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1.e+01 33") == 0);
+    ASSERT (strcmp (result, "1.e+01 33") == 0
+	    || strcmp (result, "1.e+001 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }
@@ -3325,7 +3360,8 @@
     int retval =
       my_asprintf (&result, "%.Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strcmp (result, "1e+03 33") == 0);
+    ASSERT (strcmp (result, "1e+03 33") == 0
+	    || strcmp (result, "1e+003 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
   }