[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
abs_most_negative_fixnum
From: |
Kevin Ryde |
Subject: |
abs_most_negative_fixnum |
Date: |
Sun, 28 Mar 2004 07:52:18 +1000 |
User-agent: |
Gnus/5.110002 (No Gnus v0.2) Emacs/21.3 (gnu/linux) |
* numbers.c (scm_quotient, scm_remainder): In inum/big, use mpz_cmp_ui
for big == abs(most-negative-fixnum) special case.
(abs_most_negative_fixnum): Remove, no longer used.
* tests/numbers.test (quotient, remainder): Exercise inum/big at and
near special case inum == fixnum-min, big == -fixnum-min.
--- numbers.c.~1.229.~ 2004-03-26 07:55:12.000000000 +1000
+++ numbers.c 2004-03-27 19:12:47.000000000 +1000
@@ -148,7 +148,6 @@
-static SCM abs_most_negative_fixnum;
static mpz_t z_negative_one;
@@ -703,9 +702,13 @@
else if (SCM_BIGP (y))
{
if ((SCM_INUM (x) == SCM_MOST_NEGATIVE_FIXNUM)
- && (scm_i_bigcmp (abs_most_negative_fixnum, y) == 0))
- /* Special case: x == fixnum-min && y == abs (fixnum-min) */
- return SCM_MAKINUM (-1);
+ && (mpz_cmp_ui (SCM_I_BIG_MPZ (y),
+ - SCM_MOST_NEGATIVE_FIXNUM) == 0))
+ {
+ /* Special case: x == fixnum-min && y == abs (fixnum-min) */
+ scm_remember_upto_here_1 (y);
+ return SCM_MAKINUM (-1);
+ }
else
return SCM_MAKINUM (0);
}
@@ -779,9 +782,13 @@
else if (SCM_BIGP (y))
{
if ((SCM_INUM (x) == SCM_MOST_NEGATIVE_FIXNUM)
- && (scm_i_bigcmp (abs_most_negative_fixnum, y) == 0))
- /* Special case: x == fixnum-min && y == abs (fixnum-min) */
- return SCM_MAKINUM (0);
+ && (mpz_cmp_ui (SCM_I_BIG_MPZ (y),
+ - SCM_MOST_NEGATIVE_FIXNUM) == 0))
+ {
+ /* Special case: x == fixnum-min && y == abs (fixnum-min) */
+ scm_remember_upto_here_1 (y);
+ return SCM_MAKINUM (0);
+ }
else
return x;
}
@@ -5690,9 +5697,6 @@
void
scm_init_numbers ()
{
- abs_most_negative_fixnum = scm_i_long2big (- SCM_MOST_NEGATIVE_FIXNUM);
- scm_permanent_object (abs_most_negative_fixnum);
-
mpz_init_set_si (z_negative_one, -1);
/* It may be possible to tune the performance of some algorithms by using
--- numbers.test.~1.44.~ 2004-03-26 07:45:06.000000000 +1000
+++ numbers.test 2004-03-27 19:11:43.000000000 +1000
@@ -324,7 +324,17 @@
(eqv? 1 (quotient fixnum-min fixnum-min)))
(pass-if "n = fixnum-min - 1"
- (eqv? 0 (quotient fixnum-min (- fixnum-min 1)))))
+ (eqv? 0 (quotient fixnum-min (- fixnum-min 1))))
+
+ (pass-if "n = - fixnum-min - 1"
+ (eqv? -1 (quotient fixnum-min (1- (- fixnum-min)))))
+
+ ;; special case, normally inum/big is zero
+ (pass-if "n = - fixnum-min"
+ (eqv? -1 (quotient fixnum-min (- fixnum-min))))
+
+ (pass-if "n = - fixnum-min + 1"
+ (eqv? 0 (quotient fixnum-min (1+ (- fixnum-min))))))
(with-test-prefix "(fixnum-min - 1) / n"
@@ -512,7 +522,17 @@
(eqv? 0 (remainder fixnum-min fixnum-min)))
(pass-if "n = fixnum-min - 1"
- (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1)))))
+ (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1))))
+
+ (pass-if "n = - fixnum-min - 1"
+ (eqv? -1 (remainder fixnum-min (1- (- fixnum-min)))))
+
+ ;; special case, normally inum%big is the inum
+ (pass-if "n = - fixnum-min"
+ (eqv? 0 (remainder fixnum-min (- fixnum-min))))
+
+ (pass-if "n = - fixnum-min + 1"
+ (eqv? fixnum-min (remainder fixnum-min (1+ (- fixnum-min))))))
(with-test-prefix "(fixnum-min - 1) / n"
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- abs_most_negative_fixnum,
Kevin Ryde <=