From: Jens Vollinga Date: Sat, 27 Mar 2004 14:31:36 +0000 (+0000) Subject: Synced to 1.1 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=commitdiff_plain;h=af79f5c8704c34f0a102e4c7fa3158cd1bbf7ff8;p=ginac.git Synced to 1.1 --- diff --git a/check/exam_pseries.cpp b/check/exam_pseries.cpp index a132ea8b..7ec803f8 100644 --- a/check/exam_pseries.cpp +++ b/check/exam_pseries.cpp @@ -108,13 +108,17 @@ static unsigned exam_series1() e = pow(x, 8) * pow(pow(x,3)+ pow(x + pow(x,3), 2), -2); d = pow(x, 4) - 2*pow(x, 5) + Order(pow(x, 6)); result += check_series(e, 0, d, 6); - + e = cos(x) * pow(sin(x)*(pow(x, 5) + 4 * pow(x, 2)), -3); d = pow(x, -9) / 64 - 3 * pow(x, -6) / 256 - pow(x, -5) / 960 + 535 * pow(x, -3) / 96768 + pow(x, -2) / 1280 - pow(x, -1) / 14400 - numeric(283, 129024) - 2143 * x / 5322240 + Order(pow(x, 2)); result += check_series(e, 0, d, 2); + e = sqrt(1+x*x) * sqrt(1+2*x*x); + d = 1 + Order(pow(x, 2)); + result += check_series(e, 0, d, 2); + symbol a("a"); e = pow(x, 4) * sin(a) + pow(x, 2); d = pow(x, 2) + Order(pow(x, 3)); diff --git a/ginac/pseries.cpp b/ginac/pseries.cpp index 692bb6f0..9f6643ed 100644 --- a/ginac/pseries.cpp +++ b/ginac/pseries.cpp @@ -767,10 +767,15 @@ ex mul::series(const relational & r, int order, unsigned options) const const epvector::const_iterator itbeg = seq.begin(); const epvector::const_iterator itend = seq.end(); for (epvector::const_iterator it=itbeg; it!=itend; ++it) { - + ex buf = recombine_pair_to_ex(*it); - - int real_ldegree = buf.expand().ldegree(sym-r.rhs()); + + int real_ldegree = 0; + try { + real_ldegree = buf.expand().ldegree(sym-r.rhs()); + } + catch (std::runtime_error) {} + if (real_ldegree == 0) { int orderloop = 0; do { @@ -783,7 +788,13 @@ ex mul::series(const relational & r, int order, unsigned options) const } int degsum = std::accumulate(ldegrees.begin(), ldegrees.end(), 0); - + + if (degsum>order) { + epvector epv; + epv.push_back(expair(Order(_ex1), order)); + return (new pseries(r, epv))->setflag(status_flags::dynallocated); + } + // Multiply with remaining terms std::vector::const_iterator itd = ldegrees.begin(); for (epvector::const_iterator it=itbeg; it!=itend; ++it, ++itd) {