From 3d2338dcfb016ded1d9d747e13f399325e2f509c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 14 Jan 2011 20:00:10 +0000 Subject: [PATCH] [CRT] Fix miscalculation of number of decimal points to shift for %f format. Should fix shlwapi:string tests and bug 5818. svn path=/trunk/; revision=50385 --- reactos/lib/sdk/crt/printf/streamout.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/reactos/lib/sdk/crt/printf/streamout.c b/reactos/lib/sdk/crt/printf/streamout.c index c300f3291fb..76febdd2012 100644 --- a/reactos/lib/sdk/crt/printf/streamout.c +++ b/reactos/lib/sdk/crt/printf/streamout.c @@ -115,14 +115,6 @@ format_float( exponent = get_exp(fpval); sign = fpval < 0 ? -1 : 1; - /* Shift the decimal point and round */ - fpval2 = round(sign * fpval * pow(10., precision - exponent)); - if (fpval2 >= (unsigned __int64)pow(10., precision + 1)) - { - exponent++; - fpval2 = round(sign * fpval * pow(10., precision - exponent)); - } - switch (chr) { case _T('G'): @@ -131,6 +123,9 @@ format_float( if (precision > 0) precision--; if (exponent < -4 || exponent >= precision) goto case_e; + /* Shift the decimal point and round */ + fpval2 = round(sign * fpval * pow(10., precision)); + /* Skip trailing zeroes */ while (precision && (unsigned __int64)fpval2 % 10 == 0) { @@ -143,6 +138,16 @@ format_float( digits = digits_u; case _T('e'): case_e: + /* Shift the decimal point and round */ + fpval2 = round(sign * fpval * pow(10., precision - exponent)); + + /* Compensate for changed exponent through rounding */ + if (fpval2 >= (unsigned __int64)pow(10., precision + 1)) + { + exponent++; + fpval2 = round(sign * fpval * pow(10., precision - exponent)); + } + val32 = exponent >= 0 ? exponent : -exponent; // FIXME: handle length of exponent field: @@ -168,6 +173,8 @@ format_float( // FIXME: TODO case _T('f'): + /* Shift the decimal point and round */ + fpval2 = round(sign * fpval * pow(10., precision)); break; }