From b2b10ca729e5069605ddf3fa4751e8d528aeb018 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sun, 17 Feb 2019 19:00:47 -0500 Subject: [PATCH] WIP - new version of libtommath --- include/cyclone/types.h | 2 +- runtime.c | 31 ++++++++++--------------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/include/cyclone/types.h b/include/cyclone/types.h index ea8134d8..ec15c7a5 100644 --- a/include/cyclone/types.h +++ b/include/cyclone/types.h @@ -1378,7 +1378,7 @@ void **vpbuffer_add(void **buf, int *len, int i, void *obj); void vpbuffer_free(void **buf); /* Bignum utility functions */ -double mp_get_double(mp_int *a); +double mp_get_double(const mp_int *a); int Cyc_bignum_cmp(bn_cmp_type type, object x, int tx, object y, int ty); void Cyc_int2bignum(int n, mp_int *bn); diff --git a/runtime.c b/runtime.c index 204d9c34..f993d64c 100644 --- a/runtime.c +++ b/runtime.c @@ -1422,28 +1422,17 @@ object Cyc_num_cmp_va_list(void *data, int argc, * Code is from: https://github.com/libtom/libtommath/issues/3 */ #define PRECISION 53 -double mp_get_double(mp_int *a) +double mp_get_double(const mp_int *a) { - static const int NEED_DIGITS = (PRECISION + 2 * DIGIT_BIT - 2) / DIGIT_BIT; - static const double DIGIT_MULTI = (mp_digit)1 << DIGIT_BIT; - - int i, limit; - double d = 0.0; - - mp_clamp(a); - i = USED(a); - limit = i <= NEED_DIGITS ? 0 : i - NEED_DIGITS; - - while (i-- > limit) { - d += DIGIT(a, i); - d *= DIGIT_MULTI; - } - - if(SIGN(a) == MP_NEG) - d *= -1.0; - - d *= pow(2.0, i * DIGIT_BIT); - return d; + int i; + double d = 0.0, fac = 1.0; + for (i = 0; i < DIGIT_BIT; ++i) { + fac *= 2.0; + } + for (i = a->used; i --> 0;) { + d = (d * fac) + (double)DIGIT(a, i); + } + return (a->sign == MP_NEG) ? -d : d; } // Convert a bignum back to fixnum if possible