real.c (real_to_decimal): If the >1 tens reduction loop results in a negative exponent...
authorRichard Henderson <rth@redhat.com>
Fri, 25 Oct 2002 21:58:12 +0000 (14:58 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 25 Oct 2002 21:58:12 +0000 (14:58 -0700)
        * real.c (real_to_decimal): If the >1 tens reduction loop results
        in a negative exponent, fall into the <1 pten computation.

From-SVN: r58538

gcc/ChangeLog
gcc/real.c

index dc01d932a05e89bf537689efb37a8d8d4b1ed703..7ad2654c42194ebfd408c3249ce5cb1209207552 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 a2c9d8af71a92632c880a120600541828eac9b07..c3cb719c0b96b2709769bfe576bd44f79fa54064 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;