#9129: sqrt memory leaks
--------------------------------+-------------------------------------------
   Reporter:  zimmerma          |          Owner:  AlexGhitza
       Type:  defect            |         Status:  new       
   Priority:  critical          |      Milestone:  sage-4.8  
  Component:  basic arithmetic  |       Keywords:            
Work_issues:                    |       Upstream:  N/A       
   Reviewer:                    |         Author:            
     Merged:                    |   Dependencies:            
--------------------------------+-------------------------------------------

Comment(by zimmerma):

 I added some print-statements in
 {{{pynac-0.2.3.p0/src/ginac/numeric.cpp}}} as follows:
 {{{
   Number_T pow(const Number_T& base, const Number_T& exp) {
     std::cerr << "enter pow, base=" << base << " exp=" << exp << "\n";
     verbose("pow");
     if (base.t != exp.t) {
       Number_T a, b;
       std::cerr << "coerce\n";
       coerce(a, b, base, exp);
       return pow(a,b);
     }
     switch (base.t) {
     case DOUBLE:
       std::cerr << "double\n";
       return std::pow(base.v._double, exp.v._double);
     case LONG:
       // TODO: change to use GMP!
       std::cerr << "long\n";
       return std::pow((double)base.v._long, (double)exp.v._long);
     case PYOBJECT:
       std::cerr << "PYOBJECT\n";
       if PyInt_Check(base.v._pyobject) {
           PyObject* o = Integer(PyInt_AsLong(base.v._pyobject));
           PyObject* r = PyNumber_Power(o, exp.v._pyobject, Py_None);
           std::cerr << "PyInt_Check\n";
           Py_DECREF(o);
           return r;
       }
       return PyNumber_Power(base.v._pyobject, exp.v._pyobject, Py_None);
     default:
       stub("invalid type: pow Number_T");
     }
   }
 }}}
 Then it seems that for inexact powers that function is called twice for SR
 input:
 {{{
 sage: SR(2).__pow__(1/2)
 enter pow, base=2 exp=1/2
 PYOBJECT
 enter pow, base=2 exp=1/2
 PYOBJECT
 sqrt(2)
 }}}
 but for exact powers only once:
 {{{
 sage: SR(4).__pow__(1/2)
 enter pow, base=4 exp=1/2
 PYOBJECT
 2
 }}}

 For Integer input we get:
 {{{
 sage: Integer(2).__pow__(1/2)
 enter pow, base=2 exp=1/2
 PYOBJECT
 sqrt(2)
 sage: Integer(4).__pow__(1/2)
 2
 }}}

 For ZZ input we get:
 {{{
 sage: ZZ(2).__pow__(1/2)
 enter pow, base=2 exp=1/2
 PYOBJECT
 sqrt(2)
 sage: ZZ(4).__pow__(1/2)
 2
 }}}
 In all cases there is no memory leak for exact powers, but there is for
 inexact powers.
 Thus I strongly suspect some special code that detects exact powers, but
 where is it?

 Paul

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/9129#comment:20>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to