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