[gcalctool/gcalctool-newui2] ...
- From: Robert Ancell <rancell src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gcalctool/gcalctool-newui2] ...
- Date: Mon, 17 Aug 2009 22:00:37 +0000 (UTC)
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]