summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels M?ller <nisse@lysator.liu.se>2013-01-22 21:34:36 +0100
committerNiels M?ller <nisse@lysator.liu.se>2013-01-22 21:34:36 +0100
commit5db5eb7b1f840d82e4329c0a0664f49ce90f0733 (patch)
treeec6eee44eaac08a0d14a380e862220b968cdf021
parentab83cd7413e20c0db3b652e332dcf0436d333163 (diff)
downloadgmp-5db5eb7b1f840d82e4329c0a0664f49ce90f0733.tar.gz
mini-gmp: Simplified mpz_cmp_d.
-rw-r--r--ChangeLog3
-rw-r--r--mini-gmp/mini-gmp.c53
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 <nisse@lysator.liu.se>
+ * 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;
}