diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2020-12-20 02:13:00 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2020-12-20 02:13:00 +0000 |
commit | e29b37eb75705e934b80be250eb74edc44ad100b (patch) | |
tree | 70d049cf365bca246d2d79e6f393dd4886268176 /tests | |
parent | 030198ce358f60df490c06b67be9099223f43886 (diff) | |
download | mpfr-e29b37eb75705e934b80be250eb74edc44ad100b.tar.gz |
Optimize mpfr_abs, mpfr_copysign and mpfr_setsign in the case of reused
argument, like what was already done for mpfr_neg: one can just set the
sign and handle NaN instead of calling mpfr_set4.
Completed tests/tcopysign.c to test with a reused argument.
git-svn-id: https://scm.gforge.inria.fr/anonscm/svn/mpfr/trunk@14227 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests')
-rw-r--r-- | tests/tcopysign.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/tests/tcopysign.c b/tests/tcopysign.c index 56b15bcf5..b38514b1b 100644 --- a/tests/tcopysign.c +++ b/tests/tcopysign.c @@ -26,26 +26,41 @@ static void copysign_variant (mpfr_ptr z, mpfr_srcptr x, mpfr_srcptr y, mpfr_rnd_t rnd_mode, int k) { + mpfr_srcptr p; + + /* invalid sign, to test that the sign is always correctly set */ + MPFR_SIGN (z) = 0; + + if (k >= 6) + { + MPFR_ASSERTN (MPFR_PREC (z) >= MPFR_PREC (x)); + mpfr_set (z, x, MPFR_RNDN); + p = z; + k -= 6; + } + else + p = x; + mpfr_clear_flags (); switch (k) { case 0: - mpfr_copysign (z, x, y, MPFR_RNDN); + mpfr_copysign (z, p, y, rnd_mode); return; case 1: - (mpfr_copysign) (z, x, y, MPFR_RNDN); + (mpfr_copysign) (z, p, y, rnd_mode); return; case 2: - mpfr_setsign (z, x, mpfr_signbit (y), MPFR_RNDN); + mpfr_setsign (z, p, mpfr_signbit (y), rnd_mode); return; case 3: - mpfr_setsign (z, x, (mpfr_signbit) (y), MPFR_RNDN); + mpfr_setsign (z, p, (mpfr_signbit) (y), rnd_mode); return; case 4: - (mpfr_setsign) (z, x, mpfr_signbit (y), MPFR_RNDN); + (mpfr_setsign) (z, p, mpfr_signbit (y), rnd_mode); return; case 5: - (mpfr_setsign) (z, x, (mpfr_signbit) (y), MPFR_RNDN); + (mpfr_setsign) (z, p, (mpfr_signbit) (y), rnd_mode); return; } } @@ -64,7 +79,7 @@ main (void) for (i = 0; i <= 1; i++) for (j = 0; j <= 1; j++) - for (k = 0; k <= 5; k++) + for (k = 0; k < 12; k++) { mpfr_set_nan (x); i ? MPFR_SET_NEG (x) : MPFR_SET_POS (x); |