printf-hook-builtin: Correctly round up floating point values
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user