summaryrefslogtreecommitdiff
path: root/mpf/iset_si.c
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2003-06-19 01:44:09 +0200
committerKevin Ryde <user42@zip.com.au>2003-06-19 01:44:09 +0200
commitc6ec9226d193f013813ea91c648e0e7bf1fba886 (patch)
tree4d49bf3ba17168b73f0a9ad5844aa70a101ecf50 /mpf/iset_si.c
parent8a06bd23ae79756bee97791212b5afbfc6e94f8d (diff)
downloadgmp-c6ec9226d193f013813ea91c648e0e7bf1fba886.tar.gz
* mpf/iset_si.c: Rewrite using mpf/set_si.c code, in particular this
nailifies it.
Diffstat (limited to 'mpf/iset_si.c')
-rw-r--r--mpf/iset_si.c33
1 files changed, 17 insertions, 16 deletions
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;
}