--- src/lib/inp/inpptree.c.orig 1993-05-03 09:16:54.000000000 +0000 +++ src/lib/inp/inpptree.c 2010-02-09 15:45:52.000000000 +0000 @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group +Modified: 2006 John D. Polstra - Fix differentiation of a^b where b is not + constant. **********/ #include "spice.h" @@ -206,18 +208,10 @@ mkcon(p->right->constant - 1))), arg1); } else { - /* This is complicated. f(x) ^ g(x) -> - * exp(y(x) * ln(f(x)) ... - */ - arg1 = PTdifferentiate(p->left, varnum); - arg2 = PTdifferentiate(p->right, varnum); - newp = mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES, - p->right, mkf(PTF_LN, p->left))), - mkb(PT_PLUS, mkb(PT_TIMES, p->right, - mkb(PT_DIVIDE, arg1, p->left)), - mkb(PT_TIMES, arg2, - mkf(PTF_LN, arg1)))); - + /* Rewrite a^b as exp(ln(a) * b) */ + newp = mkf(PTF_EXP, mkb(PT_TIMES, mkf(PTF_LN, p->left), p->right)); + /* Differentiate the rewritten form. */ + newp = PTdifferentiate(newp, varnum); } break; @@ -977,7 +971,7 @@ break; } - td = INPevaluate(&sbuf, &err, 0); + td = INPevaluate(&sbuf, &err, 1); if (err == OK) { el.token = TOK_VALUE; el.type = TYP_NUM;