Ilya Zakharevich on Thu, 17 Jan 2002 04:47:52 -0500


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

Re: [PATCH CVS] 2-adic shift


On Sat, Sep 29, 2001 at 11:51:05AM -0400, Ilya Zakharevich wrote:
> This adds a flag to shift() which changes the behaviour for
> right-shift of negative numbers: instead of preserving-but-ignoring the
> sign, the shift is performed as if modulo big power of 2.
> 
> This enables compatibility of shift() with 2-complement semantic of
> negative numbers.

Well, it turned out that this worked wrongly for positive numbers.  A
more complete test suite and a patch follow.

Sorry,
Ilya

shiftr(x,n)=if(x<0&&n<0,shift(x+1,n)-1,shift(x,n))

{
 test(lim,s1=1,s2=1) =
  for(s=0,lim,  print1(".");
		forvec(X = [[0,lim],[0,lim]],
			n=2^X[2]-2^X[1];
			r=shift(s1*n,s2*s,1);
			r1=shiftr(s1*n,s2*s);
			if(r==r1,,
			   print("shift("s1*n","s2*s",1) = "r" != "r1)
			  ),
		       1))
}
test(90)
test(90,-1,1)
test(90,1,-1)
test(90,-1,-1)


--- ./src/kernel/none/mp.c-pre	Thu Jan 10 08:25:28 2002
+++ ./src/kernel/none/mp.c	Thu Jan 17 01:40:12 2002
@@ -296,6 +296,8 @@ shifti3(GEN x, long n, long flag)
   {
     long lyorig;
 
+    if (s > 0)
+      flag = 0;
     n = -n;
     ly = lyorig = lx - (n>>TWOPOTBITS_IN_LONG);
     if (ly<3)