Fix rounding when printing floating point numbers.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15264 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_debuglog.c b/coregrind/m_debuglog.c
index 5c2c96c..469c694 100644
--- a/coregrind/m_debuglog.c
+++ b/coregrind/m_debuglog.c
@@ -1006,10 +1006,17 @@
             /* Silently limit the precision to 10 digits. */
             if (precision > 10) precision = 10;
 
-            /* If fracional part is not printed (precision == 0), may have to
-               round up */
-            if (precision == 0 && frac >= 0.5)
+            /* Determine fractional part, possibly round up */
+            ULong factor = 1;
+            for (cnt = 0; cnt < precision; ++cnt)
+               factor *= 10;
+            ULong frval = frac * factor;
+            if ((frac * factor - frval) > 0.5)    // round up
+               frval += 1;
+            /* Check rounding. */
+            if (frval == factor)
                ipval += 1;
+            frval %= factor;
 
             /* Find out how many characters are needed to print the number */
 
@@ -1046,14 +1053,6 @@
                send('.', send_arg2);
                ret += 1;
 
-               // Fractional part
-               ULong factor = 1;
-               for (cnt = 0; cnt < precision; ++cnt)
-                  factor *= 10;
-               ULong frval = frac * factor;
-               if ((frac * factor - frval) > 0.5)    // round up
-                  frval += 1;
-               frval %= factor;
                ret += myvprintf_int64(send, send_arg2, VG_MSG_ZJUSTIFY, 10,
                                       precision, False, frval);
             }
diff --git a/none/tests/unit_debuglog.c b/none/tests/unit_debuglog.c
index 1bd1d2a..7a71d04 100644
--- a/none/tests/unit_debuglog.c
+++ b/none/tests/unit_debuglog.c
@@ -149,5 +149,13 @@
   run("|%100lld|", ival);
   run("|%*lld|", 13, ival);
 
+  value = 0.99685224;
+  run("|%3.0f|", value);
+  run("|%3.1f|", value);
+  run("|%3.2f|", value);
+  run("|%3.3f|", value);
+  run("|%3.4f|", value);
+  run("|%3.5f|", value);
+
   return 0;
 }
diff --git a/none/tests/unit_debuglog.stderr.exp b/none/tests/unit_debuglog.stderr.exp
index c8dc03f..177a91b 100644
--- a/none/tests/unit_debuglog.stderr.exp
+++ b/none/tests/unit_debuglog.stderr.exp
@@ -127,3 +127,15 @@
 |%100lld|	debuglog = |                                                                                            -1004005|	wrote 102 chars
 |%*lld|	printf =   |     -1004005|	wrote  15 chars
 |%*lld|	debuglog = |     -1004005|	wrote  15 chars
+|%3.0f|	printf =   |  1|	wrote   5 chars
+|%3.0f|	debuglog = |  1|	wrote   5 chars
+|%3.1f|	printf =   |1.0|	wrote   5 chars
+|%3.1f|	debuglog = |1.0|	wrote   5 chars
+|%3.2f|	printf =   |1.00|	wrote   6 chars
+|%3.2f|	debuglog = |1.00|	wrote   6 chars
+|%3.3f|	printf =   |0.997|	wrote   7 chars
+|%3.3f|	debuglog = |0.997|	wrote   7 chars
+|%3.4f|	printf =   |0.9969|	wrote   8 chars
+|%3.4f|	debuglog = |0.9969|	wrote   8 chars
+|%3.5f|	printf =   |0.99685|	wrote   9 chars
+|%3.5f|	debuglog = |0.99685|	wrote   9 chars