Author: tkreuzer
Date: Fri Jan 14 20:00:10 2011
New Revision: 50385
URL:
http://svn.reactos.org/svn/reactos?rev=50385&view=rev
Log:
[CRT]
Fix miscalculation of number of decimal points to shift for %f format. Should fix
shlwapi:string tests and bug 5818.
Modified:
trunk/reactos/lib/sdk/crt/printf/streamout.c
Modified: trunk/reactos/lib/sdk/crt/printf/streamout.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/printf/streamo…
==============================================================================
--- trunk/reactos/lib/sdk/crt/printf/streamout.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/printf/streamout.c [iso-8859-1] Fri Jan 14 20:00:10 2011
@@ -115,14 +115,6 @@
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 @@
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 @@
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 @@
// FIXME: TODO
case _T('f'):
+ /* Shift the decimal point and round */
+ fpval2 = round(sign * fpval * pow(10., precision));
break;
}