OSDN Git Service

* real.c (real_to_decimal): If the >1 tens reduction loop results
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Oct 2002 21:58:12 +0000 (21:58 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Oct 2002 21:58:12 +0000 (21:58 +0000)
        in a negative exponent, fall into the <1 pten computation.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58538 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/real.c

index dc01d93..7ad2654 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-25  Richard Henderson  <rth@redhat.com>
+
+       * real.c (real_to_decimal): If the >1 tens reduction loop results
+       in a negative exponent, fall into the <1 pten computation.
+
 2002-10-25  Zack Weinberg  <zack@codesourcery.com>
 
        PR middle-end/6994
index a2c9d8a..c3cb719 100644 (file)
@@ -1552,20 +1552,28 @@ real_to_decimal (str, r_orig, buf_size, digits, crop_trailing_zeros)
       /* Find power of 10.  Do this by dividing out 10**2**M when
         this is larger than the current remainder.  Fill PTEN with 
         the power of 10 that we compute.  */
-      m = floor_log2 ((int)(r.exp * M_LOG10_2)) + 1;
-      do
+      if (r.exp > 0)
        {
-         const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
-         if (do_compare (&u, ptentwo, 0) >= 0)
+         m = floor_log2 ((int)(r.exp * M_LOG10_2)) + 1;
+         do
            {
-             do_divide (&u, &u, ptentwo);
-             do_multiply (&pten, &pten, ptentwo);
-             dec_exp += 1 << m;
+             const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
+             if (do_compare (&u, ptentwo, 0) >= 0)
+               {
+                 do_divide (&u, &u, ptentwo);
+                 do_multiply (&pten, &pten, ptentwo);
+                 dec_exp += 1 << m;
+               }
            }
+          while (--m >= 0);
        }
-      while (--m >= 0);
+      else
+       /* We managed to divide off enough tens in the above reduction
+          loop that we've now got a negative exponent.  Fall into the
+          less-than-one code to compute the proper value for PTEN.  */
+       cmp_one = -1;
     }
-  else if (cmp_one < 0)
+  if (cmp_one < 0)
     {
       int m;