From 5db5eb7b1f840d82e4329c0a0664f49ce90f0733 Mon Sep 17 00:00:00 2001 From: Niels M?ller Date: Tue, 22 Jan 2013 21:34:36 +0100 Subject: mini-gmp: Simplified mpz_cmp_d. --- ChangeLog | 3 +++ mini-gmp/mini-gmp.c | 53 ++++++++++++----------------------------------------- 2 files changed, 15 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index ae7c54ca9..473a07b6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2013-01-22 Niels Möller + * mini-gmp/mini-gmp.c (mpz_cmp_d): Simplified, just sort out + signs, then call mpz_cmpabs_d. + * mini-gmp/tests/testutils.h: Include stdio.h and stdlib.h. (numberof): New define. diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c index bf1b2dc2f..5fefd7e43 100644 --- a/mini-gmp/mini-gmp.c +++ b/mini-gmp/mini-gmp.c @@ -1572,7 +1572,7 @@ mpz_cmpabs_d (const mpz_t x, double d) if (d >= B) return -1; - /* Subtract x from d, one limb at a time. */ + /* Compare floor(d) to top limb, subtract and cancel when equal. */ for (i = xn; i-- > 0;) { mp_limb_t f, xl; @@ -1589,22 +1589,19 @@ mpz_cmpabs_d (const mpz_t x, double d) if (d > 0) return -1; else - return 0; + return 0; } int mpz_cmp_d (const mpz_t x, double d) { mp_size_t xn = x->_mp_size; - int sign; - double B, Bi; - mp_size_t i; if (xn == 0) { - if (d < 0) + if (d < 0.0) return 1; - else if (d > 0) + else if (d > 0.0) return -1; else return 0; @@ -1612,44 +1609,18 @@ mpz_cmp_d (const mpz_t x, double d) if (xn < 0) { - xn = -xn; - d = -d; - sign = -1; + if (d >= 0.0) + return -1; + else + return -mpz_cmpabs_d (x, d); } else - sign = 1; - - if (d < 1.0) - return sign; - - B = 2.0 * (double) GMP_LIMB_HIGHBIT; - Bi = 1.0 / B; - for (i = 1; i < xn; i++) { - d *= Bi; - if (d < 1.0) - return sign; - } - if (d >= B) - return -sign; - - for (i = xn; i-- > 0; i) - { - mp_limb_t f, xl; - - f = (mp_limb_t) d; - xl = x->_mp_d[i]; - if (xl > f) - return sign; - else if (xl < f) - return -sign; - d = B * (d - f); + if (d <= 0.0) + return 1; + else + return mpz_cmpabs_d (x, d); } - - if (d > 0) - return -sign; - else - return 0; } -- cgit v1.2.1