]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix strtod rounding of hex values (bug 14049).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 4 May 2012 10:44:39 +0000 (10:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 4 May 2012 10:44:39 +0000 (10:44 +0000)
ChangeLog
NEWS
stdlib/strtod_l.c
stdlib/tst-strtod.c

index 8c98f0171e62c6e6e721225f80ce400c5b1e8b1c..447d4a0f9e248c4acac8779f70b31a7fc6474283 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-04  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #14049]
+       * stdlib/strtod_l.c (____STRTOF_INTERNAL): Check for trailing
+       nonzero digits before rounding a hex value.
+       * stdlib/tst-strtod.c (tests): Add another test.
+
 2012-05-03  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * sysdeps/s390/fpu/libm-test-ulps: Update.
diff --git a/NEWS b/NEWS
index 218319712f012b1c4524a33b5e0f7eabc9e02599..0873b2f03dacd3017c3eb79025df1f5012714ea1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -23,7 +23,7 @@ Version 2.16
   13872, 13873, 13879, 13883, 13886, 13892, 13895, 13908, 13910, 13911,
   13912, 13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921, 13924,
   13926, 13927, 13928, 13938, 13941, 13942, 13963, 13967, 13970, 13973,
-  14027, 14033, 14034, 14040, 14055
+  14027, 14033, 14034, 14040, 14049, 14055
 
 * ISO C11 support:
 
index 93ead7533cc2e7f49f40478caf09122bacca510c..2166a08d21a400e97cd1ab8b99cb1a9d97cba5cd 100644 (file)
@@ -1,6 +1,5 @@
 /* Convert string representing a number to float value, using given locale.
-   Copyright (C) 1997,1998,2002,2004,2005,2006,2007,2008,2009,2010,2011
-   Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -994,8 +993,20 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
              retval[idx--] |= val >> (4 - pos - 1);
              val <<= BITS_PER_MP_LIMB - (4 - pos - 1);
              if (idx < 0)
-               return round_and_return (retval, exponent, negative, val,
-                                        BITS_PER_MP_LIMB - 1, dig_no > 0);
+               {
+                 int rest_nonzero = 0;
+                 while (--dig_no > 0)
+                   {
+                     if (*startp != L_('0'))
+                       {
+                         rest_nonzero = 1;
+                         break;
+                       }
+                     startp++;
+                   }
+                 return round_and_return (retval, exponent, negative, val,
+                                          BITS_PER_MP_LIMB - 1, rest_nonzero);
+               }
 
              retval[idx] = val;
              pos = BITS_PER_MP_LIMB - 1 - (4 - pos - 1);
index 25bee78f2e999cf88b3485d0d02d8bcf2bb400f8..738e73ebbae150c70d748bb84d01e018e8e28780 100644 (file)
@@ -69,6 +69,11 @@ static const struct ltest tests[] =
     { "+InFiNiTy", HUGE_VAL, '\0', 0 },
     { "0x80000Ap-23", 0x80000Ap-23, '\0', 0 },
     { "1e-324", 0, '\0', ERANGE },
+    { "0x100000000000008p0", 0x1p56, '\0', 0 },
+    { "0x100000000000008.p0", 0x1p56, '\0', 0 },
+    { "0x100000000000008.00p0", 0x1p56, '\0', 0 },
+    { "0x10000000000000800p0", 0x1p64, '\0', 0 },
+    { "0x10000000000000801p0", 0x1.0000000000001p64, '\0', 0 },
     { NULL, 0, '\0', 0 }
   };