From 713a425913a0a0cf592ce2cfe8d4113b994c40ce Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Fri, 30 May 2003 00:23:11 +0000 Subject: [PATCH] (z_negative_one): New variable. (scm_init_numbers): Initialize it. (scm_logcount): Use it and mpz_hamdist to count zeros for negatives. --- libguile/numbers.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index 37aa79166..0fd62c97c 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -119,6 +119,7 @@ isinf (double x) static SCM abs_most_negative_fixnum; +static mpz_t z_negative_one; @@ -1396,20 +1397,11 @@ SCM_DEFINE (scm_logcount, "logcount", 1, 0, 0, else if (SCM_BIGP (n)) { unsigned long count; - if (mpz_sgn (SCM_I_BIG_MPZ (n)) < 0) - { - mpz_t z_n; - mpz_init (z_n); - mpz_com (z_n, SCM_I_BIG_MPZ (n)); - scm_remember_upto_here_1 (n); - count = mpz_popcount (z_n); - mpz_clear (z_n); - } + if (mpz_sgn (SCM_I_BIG_MPZ (n)) >= 0) + count = mpz_popcount (SCM_I_BIG_MPZ (n)); else - { - count = mpz_popcount (SCM_I_BIG_MPZ (n)); - scm_remember_upto_here_1 (n); - } + count = mpz_hamdist (SCM_I_BIG_MPZ (n), z_negative_one); + scm_remember_upto_here_1 (n); return SCM_MAKINUM (count); } else @@ -4217,6 +4209,8 @@ 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 * the following constants to avoid the creation of bignums. Please, before * using these values, remember the two rules of program optimization: