X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fpower.cpp;h=abbee766cd6b5afa4e16f14b63406a35da2445fb;hb=ad7e72a894ece87cd67ee14ba4ed5fc16e59b140;hp=a5db62b78c0bf5503df15d1ed74e3feb5e4e4b25;hpb=27d6204effdef95a00af461fff98024e290dbaa7;p=ginac.git diff --git a/ginac/power.cpp b/ginac/power.cpp index a5db62b7..abbee766 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -36,7 +36,6 @@ #include "symbol.h" #include "print.h" #include "archive.h" -#include "debugmsg.h" #include "utils.h" namespace GiNaC { @@ -46,13 +45,10 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(power, basic) typedef std::vector intvector; ////////// -// default ctor, dtor, copy ctor assignment operator and helpers +// default ctor, dtor, copy ctor, assignment operator and helpers ////////// -power::power() : inherited(TINFO_power) -{ - debugmsg("power default ctor",LOGLEVEL_CONSTRUCT); -} +power::power() : inherited(TINFO_power) { } void power::copy(const power & other) { @@ -75,7 +71,6 @@ DEFAULT_DESTROY(power) power::power(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) { - debugmsg("power ctor from archive_node", LOGLEVEL_CONSTRUCT); n.find_ex("basis", basis, sym_lst); n.find_ex("exponent", exponent, sym_lst); } @@ -121,8 +116,6 @@ static void print_sym_pow(const print_context & c, const symbol &x, int exp) void power::print(const print_context & c, unsigned level) const { - debugmsg("power print", LOGLEVEL_PRINT); - if (is_a(c)) { inherited::print(c, level); @@ -146,7 +139,7 @@ void power::print(const print_context & c, unsigned level) const c.s << ')'; // ^-1 is printed as "1.0/" or with the recip() function of CLN - } else if (exponent.compare(_num_1) == 0) { + } else if (exponent.is_equal(_ex_1)) { if (is_a(c)) c.s << "recip("; else @@ -166,6 +159,14 @@ void power::print(const print_context & c, unsigned level) const c.s << ')'; } + } else if (is_a(c)) { + + c.s << class_name() << '('; + basis.print(c); + c.s << ','; + exponent.print(c); + c.s << ')'; + } else { if (exponent.is_equal(_ex1_2)) { @@ -186,7 +187,10 @@ void power::print(const print_context & c, unsigned level) const c.s << "("; } basis.print(c, precedence()); - c.s << '^'; + if (is_a(c)) + c.s << "**"; + else + c.s << '^'; if (is_a(c)) c.s << '{'; exponent.print(c, precedence()); @@ -245,8 +249,10 @@ int power::degree(const ex & s) const return ex_to(exponent).to_int(); else return basis.degree(s) * ex_to(exponent).to_int(); - } - return 0; + } else if (basis.has(s)) + throw(std::runtime_error("power::degree(): undefined degree because of non-integer exponent")); + else + return 0; } int power::ldegree(const ex & s) const @@ -256,8 +262,10 @@ int power::ldegree(const ex & s) const return ex_to(exponent).to_int(); else return basis.ldegree(s) * ex_to(exponent).to_int(); - } - return 0; + } else if (basis.has(s)) + throw(std::runtime_error("power::ldegree(): undefined degree because of non-integer exponent")); + else + return 0; } ex power::coeff(const ex & s, int n) const @@ -303,8 +311,6 @@ ex power::coeff(const ex & s, int n) const * @param level cut-off in recursive evaluation */ ex power::eval(int level) const { - debugmsg("power eval",LOGLEVEL_MEMBER_FUNCTION); - if ((level==1) && (flags & status_flags::evaluated)) return *this; else if (level == -max_recursion_level) @@ -478,8 +484,6 @@ ex power::eval(int level) const ex power::evalf(int level) const { - debugmsg("power evalf",LOGLEVEL_MEMBER_FUNCTION); - ex ebasis; ex eexponent; @@ -490,7 +494,7 @@ ex power::evalf(int level) const throw(std::runtime_error("max recursion level reached")); } else { ebasis = basis.evalf(level-1); - if (!is_ex_exactly_of_type(exponent,numeric)) + if (!is_exactly_a(exponent)) eexponent = exponent.evalf(level-1); else eexponent = exponent;