Dear Richard, On Tue, Jul 15, 2008 at 09:41:06PM +0200, Richard B. Kreckel wrote:
Well, over here I get:
$ cat relationaltest.cc #include <iostream> #include <ginac/ginac.h> using namespace std; using namespace GiNaC;
int main() { symbol x("x"); ex e1, e2; // do some calculation e1 = series(tgamma(x),x==0,3).op(3); e2 = series(log(x),x==1,6).op(4); cout << e1 << endl; cout << e2 << endl; if (e1 == e2) { // gotcha: what happens? cout << "e1 and e2 appear to be equal." << endl; } else { cout << "e1 and e2 appear to differ." << endl; } } $ g++ -O relationaltest.cc -lginac $ ./a.out -1/12*x^2*(2*Euler^3+Euler*Pi^2+4*zeta(3)) 1/5*(-1+x)^5 e1 and e2 appear to differ.
I'm a bit confused. The program fails to compile if I comment out declarations of operator[=!<>][=]*, like this diff --git a/ginac/operators.h b/ginac/operators.h index c08713f..a821aed 100644 --- a/ginac/operators.h +++ b/ginac/operators.h @@ -74,12 +74,14 @@ const numeric operator++(numeric & lh, int); const numeric operator--(numeric & lh, int); // binary relational operators ex with ex +/* const relational operator==(const ex & lh, const ex & rh); const relational operator!=(const ex & lh, const ex & rh); const relational operator<(const ex & lh, const ex & rh); const relational operator<=(const ex & lh, const ex & rh); const relational operator>(const ex & lh, const ex & rh); const relational operator>=(const ex & lh, const ex & rh); +*/ // input/output stream operators std::ostream & operator<<(std::ostream & os, const ex & e); So, e1 == e2 definitely creates the `relational' object. But it seems to give correct results anyway. I don't quite understand what's going on.
What is your point?
I've noticed that my program 1. *sometimes* gives incorrect result 2. *always* consumes more memory if I use operator== to compare expressions instead of .is_equal() method. Unfortunately, I'm unable to provide a simple test case. Also some (most?) templates libraries don't work with GiNaC::ex "out of box" because comparision operators return `relational' instead of bool. Best regards, Alexei -- All science is either physics or stamp collecting.