From 6f0aedc6af7b2464a595c1e96d826fb02d61e572 Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Wed, 20 May 2015 15:14:00 +0000 Subject: [PATCH] Fix rounding when printing floating point numbers. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15264 --- coregrind/m_debuglog.c | 21 ++++++++++----------- none/tests/unit_debuglog.c | 8 ++++++++ none/tests/unit_debuglog.stderr.exp | 12 ++++++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/coregrind/m_debuglog.c b/coregrind/m_debuglog.c index 5c2c96cafd..469c694675 100644 --- a/coregrind/m_debuglog.c +++ b/coregrind/m_debuglog.c @@ -1006,10 +1006,17 @@ VG_(debugLog_vprintf) ( /* 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 @@ VG_(debugLog_vprintf) ( 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 1bd1d2af1d..7a71d04d27 100644 --- a/none/tests/unit_debuglog.c +++ b/none/tests/unit_debuglog.c @@ -149,5 +149,13 @@ int main(int argc, char *argv[]) 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 c8dc03f6b4..177a91b4fa 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 -- 2.47.2