/* 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 */
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);
}
|%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