X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpower.cpp;h=999d9b147284f894f1e18298f6bd9a5465c2e9e8;hp=a4a33c576ca415e0a3baa7e6b089fd8dae22b81f;hb=dda45abd8a2c408f8b3eb7959a10dfb2468ecc3a;hpb=a377cee53b71348235ec36f83afeced7e10288a8 diff --git a/ginac/power.cpp b/ginac/power.cpp index a4a33c57..999d9b14 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's symbolic exponentiation (basis^exponent). */ /* - * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,11 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include -#include -#include -#include - #include "power.h" #include "expairseq.h" #include "add.h" @@ -43,6 +38,11 @@ #include "relational.h" #include "compiler.h" +#include +#include +#include +#include + namespace GiNaC { GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(power, basic, @@ -59,7 +59,7 @@ typedef std::vector intvector; // default constructor ////////// -power::power() : inherited(&power::tinfo_static) { } +power::power() { } ////////// // other constructors @@ -71,8 +71,9 @@ power::power() : inherited(&power::tinfo_static) { } // archiving ////////// -power::power(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) +void power::read_archive(const archive_node &n, lst &sym_lst) { + inherited::read_archive(n, sym_lst); n.find_ex("basis", basis, sym_lst); n.find_ex("exponent", exponent, sym_lst); } @@ -84,8 +85,6 @@ void power::archive(archive_node &n) const n.add_ex("exponent", exponent); } -DEFAULT_UNARCHIVE(power) - ////////// // functions overriding virtual functions from base classes ////////// @@ -377,17 +376,13 @@ ex power::eval(int level) const const ex & ebasis = level==1 ? basis : basis.eval(level-1); const ex & eexponent = level==1 ? exponent : exponent.eval(level-1); - bool basis_is_numerical = false; - bool exponent_is_numerical = false; - const numeric *num_basis; - const numeric *num_exponent; + const numeric *num_basis = NULL; + const numeric *num_exponent = NULL; if (is_exactly_a(ebasis)) { - basis_is_numerical = true; num_basis = &ex_to(ebasis); } if (is_exactly_a(eexponent)) { - exponent_is_numerical = true; num_exponent = &ex_to(eexponent); } @@ -404,7 +399,7 @@ ex power::eval(int level) const return ebasis; // ^(0,c1) -> 0 or exception (depending on real value of c1) - if (ebasis.is_zero() && exponent_is_numerical) { + if ( ebasis.is_zero() && num_exponent ) { if ((num_exponent->real()).is_zero()) throw (std::domain_error("power::eval(): pow(0,I) is undefined")); else if ((num_exponent->real()).is_negative()) @@ -425,11 +420,11 @@ ex power::eval(int level) const if (is_exactly_a(ebasis) && ebasis.op(0).info(info_flags::positive) && ebasis.op(1).info(info_flags::real)) return power(ebasis.op(0), ebasis.op(1) * eexponent); - if (exponent_is_numerical) { + if ( num_exponent ) { // ^(c1,c2) -> c1^c2 (c1, c2 numeric(), // except if c1,c2 are rational, but c1^c2 is not) - if (basis_is_numerical) { + if ( num_basis ) { const bool basis_is_crational = num_basis->is_crational(); const bool exponent_is_crational = num_exponent->is_crational(); if (!basis_is_crational || !exponent_is_crational) { @@ -769,7 +764,7 @@ unsigned power::return_type() const return basis.return_type(); } -tinfo_t power::return_type_tinfo() const +return_type_t power::return_type_tinfo() const { return basis.return_type_tinfo(); } @@ -1061,4 +1056,6 @@ ex power::expand_mul(const mul & m, const numeric & n, unsigned options, bool fr return result; } +GINAC_BIND_UNARCHIVER(power); + } // namespace GiNaC