ports/cad/spice/files/patch-src_lib_inp_inpptree_c
John Polstra 6c89186444 The spice3 "^" operator (power) did not work properly unless its
right-hand operand was a constant, because of a bug in the code to
take the derivative of an expression.  Add a patch to fix that.
2006-05-14 16:48:07 +00:00

34 lines
1.3 KiB
Text

--- src/lib/inp/inpptree.c.orig Mon May 3 02:16:54 1993
+++ src/lib/inp/inpptree.c Sun May 14 09:34:56 2006
@@ -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;