From c6ec9226d193f013813ea91c648e0e7bf1fba886 Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Thu, 19 Jun 2003 01:44:09 +0200 Subject: * mpf/iset_si.c: Rewrite using mpf/set_si.c code, in particular this nailifies it. --- mpf/iset_si.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'mpf/iset_si.c') diff --git a/mpf/iset_si.c b/mpf/iset_si.c index 3ca55f14e..717c4f3de 100644 --- a/mpf/iset_si.c +++ b/mpf/iset_si.c @@ -1,6 +1,6 @@ /* mpf_init_set_si() -- Initialize a float and assign it from a signed int. -Copyright 1993, 1994, 1995, 2000, 2001 Free Software Foundation, Inc. +Copyright 1993, 1994, 1995, 2000, 2001, 2003 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -26,24 +26,25 @@ void mpf_init_set_si (mpf_ptr r, long int val) { mp_size_t prec = __gmp_default_fp_limb_precision; + mp_size_t size; + mp_limb_t vl; + r->_mp_d = (mp_ptr) (*__gmp_allocate_func) ((prec + 1) * BYTES_PER_MP_LIMB); r->_mp_prec = prec; - if (val > 0) - { - r->_mp_d[0] = val; - r->_mp_size = 1; - r->_mp_exp = 1; - } - else if (val < 0) - { - r->_mp_d[0] = (unsigned long) -val; - r->_mp_size = -1; - r->_mp_exp = 1; - } - else + vl = (mp_limb_t) (unsigned long int) (val >= 0 ? val : -val); + + r->_mp_d[0] = vl & GMP_NUMB_MASK; + size = vl != 0; + +#if GMP_NAIL_BITS != 0 + if (vl > GMP_NUMB_MAX) { - r->_mp_size = 0; - r->_mp_exp = 0; + r->_mp_d[1] = vl >> GMP_NUMB_BITS; + size = 2; } +#endif + + r->_mp_exp = size; + r->_mp_size = val >= 0 ? size : -size; } -- cgit v1.2.1