printf-hook-builtin: Correctly round up floating point values

This commit is contained in:
Martin Willi
2013-10-11 11:06:09 +02:00
parent edc7a3d02f
commit 8af9bf70f5
2 changed files with 43 additions and 9 deletions
+28 -8
View File
@@ -97,22 +97,42 @@ START_TEST(test_printf_float)
verify("1.000000", "%f", 1.0);
verify("12345.1", "%.1f", 12345.123);
verify("1", "%.0f", 1.0);
verify("1.4", "%.1f", 1.456789);
verify("1.34", "%.2f", 1.3456789);
verify("1.234", "%.3f", 1.23456789);
verify("1.1234", "%.4f", 1.123456789);
verify("1.3", "%.1f", 1.346789);
verify("1.23", "%.2f", 1.23456789);
verify("1.123", "%.3f", 1.123456789);
verify("1.0123", "%.4f", 1.0123456789);
verify("-1.000000", "%f", -1.0);
verify("-12345.1", "%.1f", -12345.123);
verify("-1", "%.0f", -1.0);
verify("-1.4", "%.1f", -1.456789);
verify("-1.34", "%.2f", -1.3456789);
verify("-1.234", "%.3f", -1.23456789);
verify("-1.1234", "%.4f", -1.123456789);
verify("-1.3", "%.1f", -1.3456789);
verify("-1.23", "%.2f", -1.23456789);
verify("-1.123", "%.3f", -1.123456789);
verify("-1.0123", "%.4f", -1.0123456789);
verify(" 1.2", "%5.1f", 1.234);
verify("001.2", "%05.1f", 1.234);
verify("1.2 ", "%-5.1f", 1.234);
verify("12346", "%.0f", 12345.6789);
verify("2", "%.0f", 1.5);
verify("1", "%.0f", 1.49);
verify("1.2", "%.1f", 1.151);
verify("1.1", "%.1f", 1.149);
verify("1.13", "%.2f", 1.1251);
verify("1.12", "%.2f", 1.1249);
verify("1.124", "%.3f", 1.12351);
verify("1.123", "%.3f", 1.12349);
verify("-12346", "%.0f", -12345.6789);
verify("-2", "%.0f", -1.51);
verify("-1", "%.0f", -1.49);
verify("-1.2", "%.1f", -1.151);
verify("-1.1", "%.1f", -1.149);
verify("-1.13", "%.2f", -1.1251);
verify("-1.12", "%.2f", -1.1249);
verify("-1.124", "%.3f", -1.12351);
verify("-1.123", "%.3f", -1.12349);
}
END_TEST
@@ -500,6 +500,14 @@ static size_t format_double(char *q, size_t n, double val, bpf_flag_t flags,
oo = o;
tmpval = (uintmax_t)fabs(val);
if (!prec)
{
/* round up if no additional digits */
if (fabs(val) - tmpval >= 0.5)
{
tmpval++;
}
}
while (ndigits > 0)
{
qq--;
@@ -521,9 +529,14 @@ static size_t format_double(char *q, size_t n, double val, bpf_flag_t flags,
qq = q;
oo = o;
tmpval = (uintmax_t)(fabs(val) * pow(base, prec));
/* round up if required */
if (fabs(val) * pow(base, prec) - tmpval >= 0.5)
{
tmpval++;
}
while (prec > 0)
{
tmpval = (uintmax_t)(fabs(val) * pow(base, prec));
qq--;
oo--;
prec--;
@@ -531,6 +544,7 @@ static size_t format_double(char *q, size_t n, double val, bpf_flag_t flags,
{
*qq = digits[tmpval % base];
}
tmpval /= base;
}
}