summaryrefslogtreecommitdiff
path: root/tests/tget_flt.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-02-23 13:35:35 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2018-02-23 13:35:35 +0000
commitac385dbc658195c13e85423f4f9431e237ae83a6 (patch)
treea2f3ad5ee9c707fdf152f60d726892322c327142 /tests/tget_flt.c
parent8c5535cd7f30f46b2adeadbe633281392417e89a (diff)
downloadmpfr-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.c282
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);
}