 edited description
Something changes in the operation of bitwisexor from (rnrs arithmetic bitwise) as numbers get larger:
[using Sagittarius scheme shell, version 0.8.3 (x86_64pclinux)]
sash[r7rs]> (import (rnrs arithmetic bitwise)) #<unspecified> sash[r7rs]> (bitwisexor (expt 2 90) ( (expt 2 90) 1)) ; this looks fine 2475880078570760549798248447 sash[r7rs]> (bitwisexor (expt 2 91) ( (expt 2 91) 1)) ; returns a negative number 340282366915986703306233086332171714561
In other (R7 and R6) implementations I have tried, the return value is always a positive number:
> (bitwisexor (expt 2 90) ( (expt 2 90) 1)) 2475880078570760549798248447 > (bitwisexor (expt 2 91) ( (expt 2 91) 1)) ; returns a positive number 4951760157141521099596496895
The R6RS definition of bitwisexor states "exclusive or of the two's complement representations of their arguments." I think the return value for two negative numbers should be positive.
Comments (4)

Account Deleted 
repo owner Thank you for the report!
It seems this happens when(expt 2 n)
wheren
is odd and big enough to make the result bignum (e.g. 29 on 32 bit environment, 61 for 64 bit environment).Of course
n
has to be odd, otherwise it'd be positive. Idiot...So, the following is rather invalid example... e.g. `
(bitwisexor (expt 2 29) ( (expt 2 29) 1)) ; => negative number (bitwisexor (expt 2 30) ( (expt 2 30) 1)) ; => correct value
It has to be something stupid mistake on exclusive or implementation.

repo owner 
assigned issue to

assigned issue to

repo owner  changed status to resolved
Fixing issue
#226. Negative x Negative bitwise xor must not negate result→ <<cset 52e4df2d435f>>
 Log in to comment