]> www.ginac.de Git - ginac.git/commitdiff
Synced to 1.2
authorJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Sat, 27 Mar 2004 14:30:40 +0000 (14:30 +0000)
committerJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Sat, 27 Mar 2004 14:30:40 +0000 (14:30 +0000)
check/exam_pseries.cpp
ginac/pseries.cpp

index 7b4473469a2a14c6c075a3812f45aa118bbe58cc..7ec803f88aa97fcd4d3dfa9c26660507bb475b9b 100644 (file)
@@ -115,6 +115,10 @@ static unsigned exam_series1()
            + 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));
index d799e62b132a576b23430298a2237b09b0b5eef7..1efbb65d98640db836b2ca5d5a40969d5370e8c4 100644 (file)
@@ -784,10 +784,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 {
@@ -800,7 +805,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<int>::const_iterator itd = ldegrees.begin();
        for (epvector::const_iterator it=itbeg; it!=itend; ++it, ++itd) {