diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-10-12 12:15:46 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-10-12 12:15:46 +0000 |
commit | ffbe1fe2a5283b9b411b8ee31f62085fb4fbc13a (patch) | |
tree | a992f4e4158c9bb990a5bd4f98d3ffcb55f656f9 /mul.c | |
parent | 5e4710306880f4e7dd185033108b8d968a333138 (diff) | |
download | mpfr-ffbe1fe2a5283b9b411b8ee31f62085fb4fbc13a.tar.gz |
computation of inexact flag now directly uses mpfr_round_raw
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1232 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'mul.c')
-rw-r--r-- | mul.c | 20 |
1 files changed, 4 insertions, 16 deletions
@@ -71,7 +71,7 @@ mpfr_mul (a, b, c, rnd_mode) MPFR_CHANGE_SIGN(a); MPFR_CLEAR_FLAGS(a); MPFR_SET_INF(a); - return 1; + return 0; } } else if (MPFR_IS_INF(c)) @@ -88,7 +88,7 @@ mpfr_mul (a, b, c, rnd_mode) MPFR_CHANGE_SIGN(a); MPFR_CLEAR_FLAGS(a); MPFR_SET_INF(a); - return 1; + return 0; } } @@ -122,26 +122,14 @@ mpfr_mul (a, b, c, rnd_mode) if (b1 == 0) mpn_lshift (tmp, tmp, tn, 1); cc = mpfr_round_raw (ap, tmp, prec_b + prec_c, sign_product < 0, prec_a, - rnd_mode, NULL); + rnd_mode, &inexact); if (cc) /* cc = 1 ==> result is a power of two */ ap[an-1] = (mp_limb_t) 1 << (BITS_PER_MP_LIMB-1); - /* determines if the result is exact */ - if (prec_b + prec_c > prec_a) /* implies tn >= an */ - { - int left_a; - /* result is exact if bits[prec_a+1..tn*BITS_PER_MP_LIMB] of tmp are 0 */ - left_a = an * BITS_PER_MP_LIMB - prec_a; - /* 0 <= left_a < BITS_PER_MP_LIMB */ - tn -= an; - if (left_a) - inexact = (tmp[tn] & (((mp_limb_t) 1 << left_a) - 1)) != (mp_limb_t) 0; - while ((inexact == 0) && tn) - inexact = tmp[--tn] != (mp_limb_t) 0; - } TMP_FREE(marker); MPFR_EXP(a) = MPFR_EXP(b) + MPFR_EXP(c) + b1 - 1 + cc; + if (sign_product * MPFR_SIGN(a) < 0) MPFR_CHANGE_SIGN(a); |