printf-hook-builtin: Correctly round up floating point values
authorMartin Willi <martin@revosec.ch>
Fri, 27 Sep 2013 14:13:14 +0000 (16:13 +0200)
committerMartin Willi <martin@revosec.ch>
Fri, 11 Oct 2013 09:06:09 +0000 (11:06 +0200)
src/libstrongswan/tests/test_printf.c
src/libstrongswan/utils/printf_hook/printf_hook_builtin.c

index f822e5f..a7b19d9 100644 (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
 
index 6ba4841..a28ce7f 100644 (file)
@@ -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;
                }
        }