[ros-diffs] [tkreuzer] 50385: [CRT] Fix miscalculation of number of decimal points to shift for %f format. Should fix shlwapi:string tests and bug 5818.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Fri Jan 14 20:00:10 UTC 2011


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/streamout.c?rev=50385&r1=50384&r2=50385&view=diff
==============================================================================
--- 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;
     }
 




More information about the Ros-diffs mailing list