diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-02-23 13:35:35 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-02-23 13:35:35 +0000 |
commit | ac385dbc658195c13e85423f4f9431e237ae83a6 (patch) | |
tree | a2f3ad5ee9c707fdf152f60d726892322c327142 /tests/tget_flt.c | |
parent | 8c5535cd7f30f46b2adeadbe633281392417e89a (diff) | |
download | mpfr-ac385dbc658195c13e85423f4f9431e237ae83a6.tar.gz |
[src/get_flt.c] optimized code when MPFR_LIMBS_PER_FLT=1
[tests/tget_flt.c] improved coverage
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@12417 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests/tget_flt.c')
-rw-r--r-- | tests/tget_flt.c | 282 |
1 files changed, 188 insertions, 94 deletions
diff --git a/tests/tget_flt.c b/tests/tget_flt.c index b89b4cd20..5be1fe7e1 100644 --- a/tests/tget_flt.c +++ b/tests/tget_flt.c @@ -24,6 +24,28 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #include "mpfr-test.h" +/* return non-zero iff f == g, and if both are zero check the sign */ +static int +equal_flt (float f, float g) +{ + if (f != 0.0) + return f == g; + else if (g != 0) + return 0; + else /* f = g = 0: check they have the same sign */ + { + int sf, sg; + mpfr_t z; + mpfr_init2 (z, MPFR_PREC_MIN); + mpfr_set_flt (z, f, MPFR_RNDN); + sf = mpfr_signbit (z); + mpfr_set_flt (z, g, MPFR_RNDN); + sg = mpfr_signbit (z); + mpfr_clear (z); + return sf == sg; + } +} + int main (void) { @@ -187,160 +209,232 @@ main (void) } #ifdef HAVE_DENORMS_FLT - mpfr_set_si_2exp (x, 1, -150, MPFR_RNDN); - g = 0.0; - f = mpfr_get_flt (x, MPFR_RNDN); - if (f != g) + for (i = 0; i < 2; i++) { - printf ("Error for mpfr_get_flt(2^(-150),RNDN)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); + mpfr_set_si_2exp (x, 1, -150, MPFR_RNDN); + g = 0.0; + if (i == 1) + { + mpfr_neg (x, x, MPFR_RNDN); + g = -g; + } + f = mpfr_get_flt (x, MPFR_RNDN); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-150),RNDN)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDZ); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-150),RNDZ)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, (i == 0) ? MPFR_RNDD : MPFR_RNDU); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-150),%s)\n", + (i == 0) ? "RNDD" : "RNDU"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + g = FLT_MIN * FLT_EPSILON; + if (i == 1) + g = -g; + f = mpfr_get_flt (x, (i == 0) ? MPFR_RNDU : MPFR_RNDD); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-150),%s)\n", + (i == 0) ? "RNDU" : "RNDD"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDA); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-150),RNDA)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + + mpfr_set_si_2exp (x, 1, -151, MPFR_RNDN); + g = 0.0; + if (i == 1) + { + mpfr_neg (x, x, MPFR_RNDN); + g = -g; + } + f = mpfr_get_flt (x, MPFR_RNDN); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-151),RNDN)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDZ); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-151),RNDZ)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, (i == 0) ? MPFR_RNDD : MPFR_RNDU); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-151),%s)\n", + (i == 0) ? "RNDD" : "RNDU"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + g = FLT_MIN * FLT_EPSILON; + if (i == 1) + g = -g; + f = mpfr_get_flt (x, (i == 0) ? MPFR_RNDU : MPFR_RNDD); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-151),%s)\n", + (i == 0) ? "RNDU" : "RNDD"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDA); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-151),RNDA)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + + mpfr_set_si_2exp (x, 1, -149, MPFR_RNDN); + g = FLT_MIN * FLT_EPSILON; + if (i == 1) + { + mpfr_neg (x, x, MPFR_RNDN); + g = -g; + } + f = mpfr_get_flt (x, MPFR_RNDN); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-149),RNDN)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDZ); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-149),RNDZ)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDD); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-149),RNDD)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDU); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-149),RNDU)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } + f = mpfr_get_flt (x, MPFR_RNDA); + if (!equal_flt (f, g)) + { + printf ("Error for mpfr_get_flt(2^(-149),RNDA)\n"); + printf ("expected %.8e, got %.8e\n", g, f); + exit (1); + } } +#endif /* HAVE_DENORMS_FLT */ + + mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN); + g = FLT_MAX; f = mpfr_get_flt (x, MPFR_RNDZ); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-150),RNDZ)\n"); + printf ("Error for mpfr_get_flt(2^128,RNDZ)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } f = mpfr_get_flt (x, MPFR_RNDD); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-150),RNDD)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - g = FLT_MIN * FLT_EPSILON; - f = mpfr_get_flt (x, MPFR_RNDU); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-150),RNDU)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - f = mpfr_get_flt (x, MPFR_RNDA); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-150),RNDA)\n"); + printf ("Error for mpfr_get_flt(2^128,RNDD)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } - mpfr_set_si_2exp (x, 1, -151, MPFR_RNDN); - g = 0.0; - f = mpfr_get_flt (x, MPFR_RNDN); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-151),RNDN)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } + /* same for negative x */ + mpfr_set_si_2exp (x, -1, 128, MPFR_RNDN); + g = -FLT_MAX; f = mpfr_get_flt (x, MPFR_RNDZ); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-151),RNDZ)\n"); + printf ("Error for mpfr_get_flt(-2^128,RNDZ)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } - f = mpfr_get_flt (x, MPFR_RNDD); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-151),RNDD)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - g = FLT_MIN * FLT_EPSILON; f = mpfr_get_flt (x, MPFR_RNDU); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-151),RNDU)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - f = mpfr_get_flt (x, MPFR_RNDA); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-151),RNDA)\n"); + printf ("Error for mpfr_get_flt(-2^128,RNDD)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } - mpfr_set_si_2exp (x, 1, -149, MPFR_RNDN); - g = FLT_MIN * FLT_EPSILON; - f = mpfr_get_flt (x, MPFR_RNDN); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-149),RNDN)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - f = mpfr_get_flt (x, MPFR_RNDZ); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^(-149),RNDZ)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - f = mpfr_get_flt (x, MPFR_RNDD); +#if !defined(MPFR_ERRDIVZERO) + mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN); + f = mpfr_get_flt (x, MPFR_RNDN); /* 2^128 rounds to itself with extended + exponent range, we should get +Inf */ + g = infp; if (f != g) { - printf ("Error for mpfr_get_flt(2^(-149),RNDD)\n"); + printf ("Error for mpfr_get_flt(2^128,RNDN)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } f = mpfr_get_flt (x, MPFR_RNDU); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-149),RNDU)\n"); + printf ("Error for mpfr_get_flt(2^128,RNDU)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } f = mpfr_get_flt (x, MPFR_RNDA); if (f != g) { - printf ("Error for mpfr_get_flt(2^(-149),RNDA)\n"); + printf ("Error for mpfr_get_flt(2^128,RNDA)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } -#endif /* HAVE_DENORMS_FLT */ - mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN); - g = FLT_MAX; - f = mpfr_get_flt (x, MPFR_RNDZ); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^128,RNDZ)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } - f = mpfr_get_flt (x, MPFR_RNDD); - if (f != g) - { - printf ("Error for mpfr_get_flt(2^128,RNDD)\n"); - printf ("expected %.8e, got %.8e\n", g, f); - exit (1); - } -#if !defined(MPFR_ERRDIVZERO) - f = mpfr_get_flt (x, MPFR_RNDN); /* 2^128 rounds to itself with extended + /* same for negative x */ + mpfr_set_si_2exp (x, -1, 128, MPFR_RNDN); + f = mpfr_get_flt (x, MPFR_RNDN); /* -2^128 rounds to itself with extended exponent range, we should get +Inf */ - g = infp; + g = -infp; if (f != g) { - printf ("Error for mpfr_get_flt(2^128,RNDN)\n"); + printf ("Error for mpfr_get_flt(-2^128,RNDN)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } - f = mpfr_get_flt (x, MPFR_RNDU); + f = mpfr_get_flt (x, MPFR_RNDD); if (f != g) { - printf ("Error for mpfr_get_flt(2^128,RNDU)\n"); + printf ("Error for mpfr_get_flt(-2^128,RNDD)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } f = mpfr_get_flt (x, MPFR_RNDA); if (f != g) { - printf ("Error for mpfr_get_flt(2^128,RNDA)\n"); + printf ("Error for mpfr_get_flt(-2^128,RNDA)\n"); printf ("expected %.8e, got %.8e\n", g, f); exit (1); } |