]> www.ginac.de Git - ginac.git/commitdiff
* numeric::power(): try harder finding unit exponents.
authorRichard Kreckel <Richard.Kreckel@uni-mainz.de>
Wed, 21 May 2003 02:46:55 +0000 (02:46 +0000)
committerRichard Kreckel <Richard.Kreckel@uni-mainz.de>
Wed, 21 May 2003 02:46:55 +0000 (02:46 +0000)
* numeric::power_dyn(): likewise.

ginac/numeric.cpp

index 37a1ba3f02283fada1e439f97c89ae9c471ca3b4..1d4de9f5b416d4e997f6d590f0c96ef7edb57e4c 100644 (file)
@@ -758,8 +758,9 @@ const numeric numeric::div(const numeric &other) const
  *  returns result as a numeric object. */
 const numeric numeric::power(const numeric &other) const
 {
-       // Efficiency shortcut: trap the neutral exponent by pointer.
-       if (&other==_num1_p)
+       // Shortcut for efficiency and numeric stability (as in 1.0 exponent):
+       // trap the neutral exponent.
+       if (&other==_num1_p || cln::equal(cln::the<cln::cl_N>(other.value),cln::the<cln::cl_N>(_num1.value)))
                return *this;
        
        if (cln::zerop(cln::the<cln::cl_N>(value))) {
@@ -782,7 +783,8 @@ const numeric numeric::power(const numeric &other) const
  *  an ex object, where the result would end up on the heap anyways. */
 const numeric &numeric::add_dyn(const numeric &other) const
 {
-       // Efficiency shortcut: trap the neutral element by pointer.
+       // Efficiency shortcut: trap the neutral element by pointer.  This hack
+       // is supposed to keep the number of distinct numeric objects low.
        if (this==_num0_p)
                return other;
        else if (&other==_num0_p)
@@ -842,8 +844,10 @@ const numeric &numeric::div_dyn(const numeric &other) const
  *  heap anyways. */
 const numeric &numeric::power_dyn(const numeric &other) const
 {
-       // Efficiency shortcut: trap the neutral exponent by pointer.
-       if (&other==_num1_p)
+       // Efficiency shortcut: trap the neutral exponent (first try by pointer, then
+       // try harder, since calls to cln::expt() below may return amazing results for
+       // floating point exponent 1.0).
+       if (&other==_num1_p || cln::equal(cln::the<cln::cl_N>(other.value),cln::the<cln::cl_N>(_num1.value)))
                return *this;
        
        if (cln::zerop(cln::the<cln::cl_N>(value))) {