Gerhard Niklasch on Wed, 15 Nov 2000 09:36:55 +0100 (MET)


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [GP/PARI] 2.0.21 bug in exp()?


In response to:
> Message-Id: <200011150058.TAA19857@grail.cba.csuohio.edu>
> Date: Tue, 14 Nov 2000 19:58:25 -0500
> From: Michael Somos <somos@grail.cba.csuohio.edu>
> To: pari-dev@list.cr.yp.to
> Subject: [GP/PARI] 2.0.21 bug in exp()?
> 
> I just ran across a problem which I can't overcome. I downloaded
> the 2.0.21 and tried the following simple function :
...
> gp> f(x,d=10,v=0)=
> {
>   local(rc);
> /*DEB*/ if(v,print("f("x","d")"));
>   rc=
>   if(x<=0, error("only positive allowed in f()"),
>   if(d<0, error("recur depth positive"),
>   if(x==1|d==0, 0,
>   if(x<1, -f(1/x,d-1,v),
>   /*x>1*/ exp(f(x-1,d-1,v))
>   ))));
> /*DEB*/ if(v,print("f("x","d")="rc));
>   rc;
> } /* end f() */
> gp> f(16/5,8,1)
...
> f(11/5,7)=1.000000000000000000000000000
> 
> At this point the system seems to hang for a long long time. I can only
> guess that the bug may be in exp() somehow. Who knows? Shalom, Michael

Confirmed here with the current CVS version (Sun cc, Solaris 7 / sparc):
looks like a long (or infinite) loop, or of something getting called
with a wrong argument -- the inner end of the stack trace of the running
process is:

 ff09cb70 ???????? (ff2fb334, ff2fb338, f8003a23, fc338, 1abc28, b29)
 ff203108 mpexp1   (800000, ffffff, 101c88, 251c38, 101c88, ff000000) + 360
 ff203670 gexp     (3a1b18, 5, 0, 0, 0, 3a1b18) + 104
 ff280c8c identifier (ff2d8a60, ff2c0ab0, ff30c6fc, 0, ff20356c, 0) + 1534
 ff27b2d8 truc     (ff2c0800, 65, 6b9b1, 4a9c14, 6b9b1, ff2c0ab0) + 3ec
 ff27aab0 facteur  (5dca4, ff18d338, ff2c0ab0, 1, 4a9c14, ff18d000) + 38
 ff279c40 expr     (ff2c0800, 65, 4a9c14, 6b9b1, 16d441, ff18d428) + 104
 ff279a14 seq      (ff2c0800, 2c, 4a9c13, 449a74, 16d441, 261652) + 88

the function called by mpexp1 turns out to be:

0xff203108: mpexp1+0x0360:      call    mulrr

and this is the first mulrr call from mpexp1:
===8<---
  s=0; l1=4; av2 = avma;
  for (i=n; i>=2; i--)
  {
    setlg(p4,l1); p3 = divrs(p4,i);
    s -= expo(p3); p1 = mulrr(p3,p2); setlg(p1,l1); /* <<<<<< */
    l1 += s>>TWOPOTBITS_IN_LONG; if (l1>l2) l1=l2;
    s %= BITS_IN_LONG;
    setlg(unr,l1); p1 = addrr(unr,p1);
    setlg(p2,l1); affrr(p1,p2); avma = av2;
  }
--->8===

But ff09cb70 is wayyyyy beyond mulrr, it would correspond to
mpsqrtl+0x01c8 in my binary, so the C stack may have be corrupted.

(Karim, is this another incarnation of the recent problem with the
shift macros...?)

Puzzled, Gerhard