summaryrefslogtreecommitdiff
path: root/set_d.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>1999-06-25 15:07:31 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>1999-06-25 15:07:31 +0000
commitb4526550d8f5f9757e0f23b0403ac4058eb20aa5 (patch)
tree68e13e71068bfe44dac32a8daab51b730dc72536 /set_d.c
parent02f801d587fb0d446e0681d65c3588c90aa78b0c (diff)
downloadmpfr-b4526550d8f5f9757e0f23b0403ac4058eb20aa5.tar.gz
adapted mpfr_set_d to case where allocated limbs > significant limbs
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@192 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'set_d.c')
-rw-r--r--set_d.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/set_d.c b/set_d.c
index 9e145ea10..5cce11a4c 100644
--- a/set_d.c
+++ b/set_d.c
@@ -208,28 +208,23 @@ __mpfr_scale2 (d, exp)
void
mpfr_set_d(mpfr_t r, double d, unsigned char rnd_mode)
{
- int negative, sizer; unsigned int cnt;
+ int signd, sizer; unsigned int cnt;
- if (d == 0)
- {
- EXP(r) = 0;
- for (cnt = 0; cnt < MPFR_LIMBS_PER_DOUBLE; cnt++) { MANT(r)[cnt] = 0; }
- return;
- }
+ if (d == 0) { SET_ZERO(r); return; }
else if (isnan(d)) { SET_NAN(r); return; }
- negative = d < 0;
+ signd = (d < 0) ? -1 : 1;
d = ABS (d);
+ sizer = (PREC(r)-1)/BITS_PER_MP_LIMB + 1;
- sizer = MPFR_LIMBS_PER_DOUBLE; if (ABSSIZE(r)<sizer) sizer=ABSSIZE(r);
/* warning: __mpfr_extract_double requires at least two limbs */
- EXP(r) = __mpfr_extract_double (MANT(r), d, (sizer>=2) );
+ EXP(r) = __mpfr_extract_double (MANT(r)+sizer-2, d, (sizer>=2) );
count_leading_zeros(cnt, MANT(r)[sizer-1]);
if (cnt) mpn_lshift(MANT(r), MANT(r), sizer, cnt);
EXP(r) -= cnt;
- SIZE(r) = sizer; if (negative) CHANGE_SIGN(r);
+ if (SIZE(r)*signd<0) CHANGE_SIGN(r);
mpfr_round(r, rnd_mode, PREC(r));
return;