]> www.ginac.de Git - ginac.git/blobdiff - ginac/power.cpp
- prepared for 1.0.13 release
[ginac.git] / ginac / power.cpp
index be7c2d371f61a12f1ec72697bd21f7d0ff41fa3b..0730e3c8bf7fc385c5d4d1c1a97b6c565997cfab 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's symbolic exponentiation (basis^exponent). */
 
 /*
- *  GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2003 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
@@ -125,7 +125,7 @@ void power::print(const print_context & c, unsigned level) const
 
                // Integer powers of symbols are printed in a special, optimized way
                if (exponent.info(info_flags::integer)
-                && (is_exactly_a<symbol>(basis) || is_exactly_a<constant>(basis))) {
+                && (is_a<symbol>(basis) || is_a<constant>(basis))) {
                        int exp = ex_to<numeric>(exponent).to_int();
                        if (exp > 0)
                                c.s << '(';
@@ -172,11 +172,23 @@ void power::print(const print_context & c, unsigned level) const
 
                bool is_tex = is_a<print_latex>(c);
 
-               if (exponent.is_equal(_ex1_2)) {
+               if (is_tex && is_exactly_a<numeric>(exponent) && ex_to<numeric>(exponent).is_negative()) {
+
+                       // Powers with negative numeric exponents are printed as fractions in TeX
+                       c.s << "\\frac{1}{";
+                       power(basis, -exponent).eval().print(c);
+                       c.s << "}";
+
+               } else if (exponent.is_equal(_ex1_2)) {
+
+                       // Square roots are printed in a special way
                        c.s << (is_tex ? "\\sqrt{" : "sqrt(");
                        basis.print(c);
                        c.s << (is_tex ? '}' : ')');
+
                } else {
+
+                       // Ordinary output of powers using '^' or '**'
                        if (precedence() <= level)
                                c.s << (is_tex ? "{(" : "(");
                        basis.print(c, precedence());
@@ -764,10 +776,10 @@ ex power::expand_add_2(const add & a) const
                        }
                } else {
                        if (is_ex_exactly_of_type(r,mul)) {
-                               sum.push_back(expair(expand_mul(ex_to<mul>(r),_num2),
+                               sum.push_back(a.combine_ex_with_coeff_to_pair(expand_mul(ex_to<mul>(r),_num2),
                                                     ex_to<numeric>(c).power_dyn(_num2)));
                        } else {
-                               sum.push_back(expair((new power(r,_ex2))->setflag(status_flags::dynallocated),
+                               sum.push_back(a.combine_ex_with_coeff_to_pair((new power(r,_ex2))->setflag(status_flags::dynallocated),
                                                     ex_to<numeric>(c).power_dyn(_num2)));
                        }
                }
@@ -811,16 +823,16 @@ ex power::expand_mul(const mul & m, const numeric & n) const
        epvector::const_iterator last = m.seq.end();
        epvector::const_iterator cit = m.seq.begin();
        while (cit!=last) {
-               if (is_ex_exactly_of_type((*cit).rest,numeric)) {
-                       distrseq.push_back(m.combine_pair_with_coeff_to_pair(*cit,n));
+               if (is_ex_exactly_of_type(cit->rest,numeric)) {
+                       distrseq.push_back(m.combine_pair_with_coeff_to_pair(*cit, n));
                } else {
                        // it is safe not to call mul::combine_pair_with_coeff_to_pair()
                        // since n is an integer
-                       distrseq.push_back(expair((*cit).rest, ex_to<numeric>((*cit).coeff).mul(n)));
+                       distrseq.push_back(expair(cit->rest, ex_to<numeric>(cit->coeff).mul(n)));
                }
                ++cit;
        }
-       return (new mul(distrseq,ex_to<numeric>(m.overall_coeff).power_dyn(n)))->setflag(status_flags::dynallocated);
+       return (new mul(distrseq, ex_to<numeric>(m.overall_coeff).power_dyn(n)))->setflag(status_flags::dynallocated);
 }
 
 } // namespace GiNaC