[gcalctool/gcalctool-newui2] ...



commit a180029c8ba9537573601d915c167fcb9fde8e86
Author: Robert Ancell <robert ancell gmail com>
Date:   Tue Jul 28 17:46:02 2009 +1000

    ...

 src/mp-equation-parser.y |    4 ++--
 src/mp.c                 |   38 +++++++++-----------------------------
 2 files changed, 11 insertions(+), 31 deletions(-)
---
diff --git a/src/mp-equation-parser.y b/src/mp-equation-parser.y
index f8cc342..4316b2e 100644
--- a/src/mp-equation-parser.y
+++ b/src/mp-equation-parser.y
@@ -82,8 +82,8 @@ static void do_mod(yyscan_t yyscanner, const MPNumber *x, const MPNumber *y, MPN
 }
 %}
 
-%define api.pure
-%name-prefix "_mp_equation_"
+%pure-parser
+%name-prefix="_mp_equation_"
 %locations
 %parse-param {yyscan_t yyscanner}
 %lex-param {yyscan_t yyscanner}
diff --git a/src/mp.c b/src/mp.c
index 6f6e566..d87a6b0 100644
--- a/src/mp.c
+++ b/src/mp.c
@@ -689,7 +689,7 @@ mp_is_equal(const MPNumber *x, const MPNumber *y)
 static void
 mpexp(const MPNumber *x, MPNumber *z)
 {
-    int i, q, ib, ic;
+    int i, q;
     float rlb;
     MPNumber t1, t2;
 
@@ -709,15 +709,17 @@ mpexp(const MPNumber *x, MPNumber *z)
     mp_set_from_mp(x, &t1);
     rlb = log((float)MP_BASE);
 
-    /* COMPUTE APPROXIMATELY OPTIMAL Q (AND DIVIDE X BY 2**Q) */
+    /* Compute approximately optimal q (and divide x by 2^q) */
     q = (int)(sqrt((float)MP_T * 0.48f * rlb) + (float) x->exponent * 1.44f * rlb);
 
     /* HALVE Q TIMES */
     if (q > 0) {
+        int ib, ic;
+        
         ib = MP_BASE << 2;
         ic = 1;
         for (i = 1; i <= q; ++i) {
-            ic <<= 1;
+            ic *= 2;
             if (ic < ib && ic != MP_BASE && i < q)
                 continue;
             mp_divide_integer(&t1, ic, &t1);
@@ -729,23 +731,19 @@ mpexp(const MPNumber *x, MPNumber *z)
         mp_set_from_integer(0, z);
         return;
     }
+
+    /* Sum series, reducing t where possible */
     mp_set_from_mp(&t1, z);
     mp_set_from_mp(&t1, &t2);
-
-    /* SUM SERIES, REDUCING T WHERE POSSIBLE */
-    for (i = 2; ; i++)  {
-        if (MP_T + t2.exponent - z->exponent <= 0)
-            break;
-
+    for (i = 2; MP_T + t2.exponent - z->exponent > 0; i++) {
         mp_multiply(&t1, &t2, &t2);
         mp_divide_integer(&t2, i, &t2);
-
         mp_add(&t2, z, z);
         if (t2.sign == 0)
             break;
     }
 
-    /* APPLY (X+1)**2 - 1 = X(2 + X) FOR Q ITERATIONS */
+    /* Apply (x+1)^2 - 1 = x(2 + x) for q iterations */
     for (i = 1; i <= q; ++i) {
         mp_add_integer(z, 2, &t1);
         mp_multiply(&t1, z, z);
@@ -787,13 +785,6 @@ mp_epowy(const MPNumber *x, MPNumber *z)
     xs = x->sign;
     mp_abs(x, &t2);
 
-    /*  IF ABS(X) > M POSSIBLE THAT INT(X) OVERFLOWS,
-     *  SO DIVIDE BY 32.
-     */
-    /*if (fabs(rx) > (float)MP.m) {
-        mp_divide_integer(&t2, 32, &t2);
-    }*/
-
     /* GET FRACTIONAL AND INTEGER PARTS OF ABS(X) */
     ix = mp_cast_to_int(&t2);
     mp_fractional_component(&t2, &t2);
@@ -833,17 +824,6 @@ mp_epowy(const MPNumber *x, MPNumber *z)
     /* MULTIPLY EXPS OF INTEGER AND FRACTIONAL PARTS */
     mp_multiply(z, &t2, z);
 
-    /* MUST CORRECT RESULT IF DIVIDED BY 32 ABOVE. */
-    /*if (fabs(rx) > (float)MP.m && z->sign != 0) {
-        for (i = 1; i <= 5; ++i) {
-            // SAVE EXPONENT TO AVOID OVERFLOW IN MP_MULTIPLY
-            ie = z->exponent;
-            z->exponent = 0;
-            mp_multiply(z, z, z);
-            z->exponent += ie << 1;
-        }
-    }*/
-
     /*  CHECK THAT RELATIVE ERROR LESS THAN 0.01 UNLESS ABS(X) LARGE
      *  (WHEN EXP MIGHT OVERFLOW OR UNDERFLOW)
      */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]