fix modulo and remainder related to most negative fixnum

Robby noticed the bug while looking for undefined behavior.
This commit is contained in:
Matthew Flatt 2016-03-29 20:04:49 -06:00
parent bfd2404328
commit 91eaf40b1f
2 changed files with 12 additions and 3 deletions

View File

@ -1110,6 +1110,15 @@
(err/rt-test (remainder 2 1+2i))
(err/rt-test (modulo 2 1+2i))
(test (- (expt 2 65) (expt 2 62))
modulo (- (+ (expt 2 62) (expt 2 65))) (expt 2 65))
(test (- (expt 2 33) (expt 2 30))
modulo (- (+ (expt 2 30) (expt 2 33))) (expt 2 33))
(test (- (expt 2 62))
remainder (- (+ (expt 2 62) (expt 2 65))) (expt 2 65))
(test (- (expt 2 30))
remainder (- (+ (expt 2 30) (expt 2 33))) (expt 2 33))
(test 10 bitwise-ior 10)
(test 10 bitwise-and 10)
(test 10 bitwise-xor 10)

View File

@ -1094,7 +1094,7 @@ rem_mod (int argc, Scheme_Object *argv[], char *name, int first_sign)
/* Easier if we can assume 'r' is positive: */
if (SCHEME_INTP(r)) {
if (SCHEME_INT_VAL(r) < 0)
r = scheme_make_integer(-SCHEME_INT_VAL(r));
r = scheme_make_integer_value(-SCHEME_INT_VAL(r));
} else if (!SCHEME_BIGPOS(r))
r = scheme_bignum_negate(r);
@ -1118,9 +1118,9 @@ rem_mod (int argc, Scheme_Object *argv[], char *name, int first_sign)
if (negate) {
if (SCHEME_INTP(r))
r = scheme_make_integer(-SCHEME_INT_VAL(r));
r = scheme_make_integer_value(-SCHEME_INT_VAL(r));
else
r = scheme_bignum_negate(r);
r = scheme_bignum_normalize(scheme_bignum_negate(r));
}
}