From: Chris Dams Date: Tue, 4 Apr 2006 17:10:54 +0000 (+0000) Subject: Made log(exp(Pi)) evaluate to Pi. X-Git-Tag: release_1-4-0~99 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=9f72781762c9ec7fe10a1f73207d734d79b71917;hp=2893c8e04685b99317384ff02a0fefc899f499f9 Made log(exp(Pi)) evaluate to Pi. --- diff --git a/doc/tutorial/ginac.texi b/doc/tutorial/ginac.texi index 93b00e6f..a6f802be 100644 --- a/doc/tutorial/ginac.texi +++ b/doc/tutorial/ginac.texi @@ -3886,7 +3886,7 @@ table: @item @code{numeric} @tab @dots{}a number (same as @code{is_a(...)}) @item @code{real} -@tab @dots{}a real integer, rational or float (i.e. is not complex) +@tab @dots{}a real number, symbol or constant (i.e. is not complex) @item @code{rational} @tab @dots{}an exact rational number (integers are rational, too) @item @code{integer} diff --git a/ginac/constant.cpp b/ginac/constant.cpp index 5cfecc96..8ae372be 100644 --- a/ginac/constant.cpp +++ b/ginac/constant.cpp @@ -44,7 +44,7 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(constant, basic, // public -constant::constant() : basic(&constant::tinfo_static), ef(0), serial(next_serial++) +constant::constant() : basic(&constant::tinfo_static), ef(0), serial(next_serial++), domain(domain::complex) { setflag(status_flags::evaluated | status_flags::expanded); } @@ -55,8 +55,8 @@ constant::constant() : basic(&constant::tinfo_static), ef(0), serial(next_serial // public -constant::constant(const std::string & initname, evalffunctype efun, const std::string & texname) - : basic(&constant::tinfo_static), name(initname), ef(efun), serial(next_serial++) +constant::constant(const std::string & initname, evalffunctype efun, const std::string & texname, unsigned dm) + : basic(&constant::tinfo_static), name(initname), ef(efun), serial(next_serial++), domain(dm) { if (texname.empty()) TeX_name = "\\mbox{" + name + "}"; @@ -65,8 +65,8 @@ constant::constant(const std::string & initname, evalffunctype efun, const std:: setflag(status_flags::evaluated | status_flags::expanded); } -constant::constant(const std::string & initname, const numeric & initnumber, const std::string & texname) - : basic(&constant::tinfo_static), name(initname), ef(0), number(initnumber), serial(next_serial++) +constant::constant(const std::string & initname, const numeric & initnumber, const std::string & texname, unsigned dm) + : basic(&constant::tinfo_static), name(initname), ef(0), number(initnumber), serial(next_serial++), domain(dm) { if (texname.empty()) TeX_name = "\\mbox{" + name + "}"; @@ -136,6 +136,16 @@ void constant::do_print_python_repr(const print_python_repr & c, unsigned level) c.s << ')'; } +bool constant::info(unsigned inf) const +{ + if (inf == info_flags::polynomial) + return true; + if (inf == info_flags::real) + return domain == domain::real; + else + return inherited::info(inf); +} + ex constant::evalf(int level) const { if (ef!=0) { @@ -212,13 +222,13 @@ unsigned constant::next_serial = 0; ////////// /** Pi. (3.14159...) Diverts straight into CLN for evalf(). */ -const constant Pi("Pi", PiEvalf, "\\pi"); +const constant Pi("Pi", PiEvalf, "\\pi", domain::real); /** Euler's constant. (0.57721...) Sometimes called Euler-Mascheroni constant. * Diverts straight into CLN for evalf(). */ -const constant Euler("Euler", EulerEvalf, "\\gamma_E"); +const constant Euler("Euler", EulerEvalf, "\\gamma_E", domain::real); /** Catalan's constant. (0.91597...) Diverts straight into CLN for evalf(). */ -const constant Catalan("Catalan", CatalanEvalf, "G"); +const constant Catalan("Catalan", CatalanEvalf, "G", domain::real); } // namespace GiNaC diff --git a/ginac/constant.h b/ginac/constant.h index 99226376..4b4a5e45 100644 --- a/ginac/constant.h +++ b/ginac/constant.h @@ -43,11 +43,12 @@ class constant : public basic // other constructors public: - constant(const std::string & initname, evalffunctype efun = 0, const std::string & texname = std::string()); - constant(const std::string & initname, const numeric & initnumber, const std::string & texname = std::string()); + constant(const std::string & initname, evalffunctype efun = 0, const std::string & texname = std::string(), unsigned domain = domain::complex); + constant(const std::string & initname, const numeric & initnumber, const std::string & texname = std::string(), unsigned domain = domain::complex); // functions overriding virtual functions from base classes public: + bool info(unsigned inf) const; ex evalf(int level = 0) const; bool is_polynomial(const ex & var) const; protected: @@ -70,6 +71,7 @@ private: ex number; ///< numerical value this constant evalf()s to unsigned serial; ///< unique serial number for comparison static unsigned next_serial; + unsigned domain; ///< numerical value this constant evalf()s to }; extern const constant Pi; diff --git a/ginac/inifcns_trans.cpp b/ginac/inifcns_trans.cpp index 12c0d20c..364ec55e 100644 --- a/ginac/inifcns_trans.cpp +++ b/ginac/inifcns_trans.cpp @@ -128,14 +128,8 @@ static ex log_eval(const ex & x) // log(exp(t)) -> t (if -Pi < t.imag() <= Pi): if (is_ex_the_function(x, exp)) { const ex &t = x.op(0); - if (is_a(t) && t.info(info_flags::real)) { + if (t.info(info_flags::real)) return t; - } - if (t.info(info_flags::numeric)) { - const numeric &nt = ex_to(t); - if (nt.is_real()) - return t; - } } return log(x).hold();