fix modulo
and remainder
related to most negative fixnum
Robby noticed the bug while looking for undefined behavior.
This commit is contained in:
parent
bfd2404328
commit
91eaf40b1f
|
@ -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)
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user