diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2007-06-20 10:03:03 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2007-06-20 10:03:03 +0000 |
commit | 11583c1ff067f8d42d2cdfb03c59b24044537ceb (patch) | |
tree | a58bc953dab289d718d614c454c2b5cc82b5015e /expm1.c | |
parent | 0d64e3be5e22412ef59e19b086c35c5cce9b1052 (diff) | |
download | mpfr-11583c1ff067f8d42d2cdfb03c59b24044537ceb.tar.gz |
Added MPFR_SMALL_INPUT_AFTER_SAVE_EXPO macro; updated expm1.c to use
this variant (and moved MPFR_SAVE_EXPO_MARK after the test ex < 0).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@4544 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'expm1.c')
-rw-r--r-- | expm1.c | 16 |
1 files changed, 6 insertions, 10 deletions
@@ -64,21 +64,19 @@ mpfr_expm1 (mpfr_ptr y, mpfr_srcptr x , mp_rnd_t rnd_mode) } } - MPFR_SAVE_EXPO_MARK (expo); - ex = MPFR_GET_EXP (x); if (ex < 0) { /* For -1 < x < 0, abs(expm1(x)-x) < x^2/2. For 0 < x < 1, abs(expm1(x)-x) < x^2. */ if (MPFR_IS_POS (x)) - MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, - ex, 0, 1, rnd_mode, - { inexact = _inexact; goto end; }); + MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, - ex, 0, 1, rnd_mode, {}); else - MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, - ex, 1, 0, rnd_mode, - { inexact = _inexact; goto end; }); + MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, - ex, 1, 0, rnd_mode, {}); } + MPFR_SAVE_EXPO_MARK (expo); + if (MPFR_IS_NEG (x) && ex > 5) /* x <= -32 */ { mpfr_t minus_one, t; @@ -97,10 +95,8 @@ mpfr_expm1 (mpfr_ptr y, mpfr_srcptr x , mp_rnd_t rnd_mode) <= 2^max(MPFR_EMIN_MIN,-LONG_MAX,ceil(x/ln(2)+epsilon)) with epsilon > 0 */ mpfr_clear (t); - MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, minus_one, err, 0, 0, rnd_mode, - { mpfr_clear (minus_one); - inexact = _inexact; - goto end; }); + MPFR_SMALL_INPUT_AFTER_SAVE_EXPO (y, minus_one, err, 0, 0, rnd_mode, + expo, { mpfr_clear (minus_one); }); mpfr_clear (minus_one); } |