]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix rounding when printing floating point numbers.
authorFlorian Krohm <florian@eich-krohm.de>
Wed, 20 May 2015 15:14:00 +0000 (15:14 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Wed, 20 May 2015 15:14:00 +0000 (15:14 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15264

coregrind/m_debuglog.c
none/tests/unit_debuglog.c
none/tests/unit_debuglog.stderr.exp

index 5c2c96cafdd026fe27b8cb0bb884e2ddefd6256f..469c694675e693218e0b7e5f7666ff7a9a13c2fe 100644 (file)
@@ -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);
             }
index 1bd1d2af1d868e48039385e7b9f49b8544eb63cd..7a71d04d2724c6c8b280363936a4b669b093a914 100644 (file)
@@ -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;
 }
index c8dc03f6b4fc6889b587402b14ad7dfaeefdd3c6..177a91b4fad97e5af0e5857054ec3ca5f9352f66 100644 (file)
 |%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