- edited description
bitwise-xor inconsistency with other schemes
Something changes in the operation of bitwise-xor from (rnrs arithmetic bitwise) as numbers get larger:
[using Sagittarius scheme shell, version 0.8.3 (x86_64-pc-linux)]
sash[r7rs]> (import (rnrs arithmetic bitwise))
#<unspecified>
sash[r7rs]> (bitwise-xor (expt -2 90) (- (expt -2 90) 1)) ; this looks fine
2475880078570760549798248447
sash[r7rs]> (bitwise-xor (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:
> (bitwise-xor (expt -2 90) (- (expt -2 90) 1))
2475880078570760549798248447
> (bitwise-xor (expt -2 91) (- (expt -2 91) 1)) ; returns a positive number
4951760157141521099596496895
The R6RS definition of bitwise-xor 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. `
(bitwise-xor (expt -2 29) (- (expt -2 29) 1)) ; => negative number (bitwise-xor (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