diff options
author | jdp <jdp@FreeBSD.org> | 2006-05-15 00:48:07 +0800 |
---|---|---|
committer | jdp <jdp@FreeBSD.org> | 2006-05-15 00:48:07 +0800 |
commit | d14af2bad7924e3581c3ed08115e2099bafafaa2 (patch) | |
tree | 18b2a26a97a3bb1c4201eb16d225f6af9771db25 | |
parent | d3c8e948019c16d7114471a427f4fbebce2e0de1 (diff) | |
download | freebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.tar.gz freebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.tar.zst freebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.zip |
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.
-rw-r--r-- | cad/spice/files/patch-src_lib_inp_inpptree_c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/cad/spice/files/patch-src_lib_inp_inpptree_c b/cad/spice/files/patch-src_lib_inp_inpptree_c new file mode 100644 index 000000000000..0819cac1407d --- /dev/null +++ b/cad/spice/files/patch-src_lib_inp_inpptree_c @@ -0,0 +1,34 @@ +--- 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; + |