summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-02 17:17:09 +0000
committerthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-02 17:17:09 +0000
commit016790506bc74378846496455ccaf6f328dca809 (patch)
treef35269c16f7d1942348c34170a5c4f28cf99f95b
parent0622de8c9f06a5579febd362da72639bd6e17e1f (diff)
downloadmpc-016790506bc74378846496455ccaf6f328dca809.tar.gz
[tests/] Move functions iterating over rounding modes in a separate file.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/branches/benchs_tests@1349 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/rounding.c131
-rw-r--r--tests/templates.h5
-rw-r--r--tests/tgeneric.tpl111
4 files changed, 137 insertions, 112 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 73d71a1..acd0204 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -47,7 +47,7 @@ check_LTLIBRARIES=libmpc-tests.la
libmpc_tests_la_SOURCES=mpc-tests.h random.c tgeneric.c read_data.c \
comparisons.c templates.h check_data.c clear_parameters.c \
close_datafile.c copy_parameter.c init_parameters.c open_datafile.c \
- print_parameter.c read_description.c read_line.c tpl_gmp.c \
+ print_parameter.c read_description.c read_line.c rounding.c tpl_gmp.c \
tpl_mpc.c tpl_mpfr.c tpl_native.c
DESCRIPTIONS = abs.dsc acos.dsc acosh.dsc asin.dsc asinh.dsc atan.dsc \
diff --git a/tests/rounding.c b/tests/rounding.c
new file mode 100644
index 0000000..72b240a
--- /dev/null
+++ b/tests/rounding.c
@@ -0,0 +1,131 @@
+/* rounding.c -- file for functions iterating over rounding modes.
+
+Copyright (C) 2013 INRIA
+
+This file is part of GNU MPC.
+
+GNU MPC is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program. If not, see http://www.gnu.org/licenses/ .
+*/
+
+#include "templates.h"
+
+/* helper functions for iterating over mpfr rounding modes */
+
+#define FIRST_MPFR_RND_MODE MPFR_RNDN
+
+static mpfr_rnd_t
+next_mpfr_rnd_mode (mpfr_rnd_t curr)
+{
+ switch (curr)
+ {
+ case MPFR_RNDN:
+ return MPFR_RNDZ;
+ case MPFR_RNDZ:
+ return MPFR_RNDU;
+ case MPFR_RNDU:
+ return MPFR_RNDD;
+ default:
+ /* return invalid guard value in mpfr_rnd_t */
+#if MPFR_VERSION_MAJOR < 3
+ return MPFR_RNDNA;
+#else
+ return MPFR_RNDA; /* valid rounding type, but not used in mpc */
+#endif
+ }
+}
+
+static int
+is_valid_mpfr_rnd_mode (mpfr_rnd_t curr)
+/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
+{
+ if ( curr == MPFR_RNDN || curr == MPFR_RNDZ
+ || curr == MPFR_RNDU || curr == MPFR_RNDD)
+ return 1;
+ else
+ return 0;
+}
+
+
+/* functions using abstract parameters */
+
+void
+first_rnd_mode (mpc_fun_param_t *params)
+{
+ int rnd_mode_index = params->nbout + params->nbin - 1;
+ switch (params->T[rnd_mode_index])
+ {
+ case MPC_RND:
+ params->P[rnd_mode_index].mpc_rnd =
+ MPC_RND(FIRST_MPFR_RND_MODE, FIRST_MPFR_RND_MODE);
+ break;
+ case MPFR_RND:
+ params->P[rnd_mode_index].mpfr_rnd = FIRST_MPFR_RND_MODE;
+ break;
+ default:
+ printf ("The rounding mode is expected to be"
+ " the last input parameter.\n");
+ exit (-1);
+ }
+}
+
+void
+next_rnd_mode (mpc_fun_param_t *params)
+{
+ mpfr_rnd_t rnd_re, rnd_im;
+ int rnd_mode_index = params->nbout + params->nbin - 1;
+ switch (params->T[rnd_mode_index])
+ {
+ case MPC_RND:
+ rnd_re = MPC_RND_RE (params->P[rnd_mode_index].mpc_rnd);
+ rnd_im = MPC_RND_IM (params->P[rnd_mode_index].mpc_rnd);
+ rnd_im = next_mpfr_rnd_mode (rnd_im);
+ if (!is_valid_mpfr_rnd_mode (rnd_im))
+ {
+ rnd_re = next_mpfr_rnd_mode (rnd_re);
+ rnd_im = FIRST_MPFR_RND_MODE;
+ }
+ params->P[rnd_mode_index].mpc_rnd = MPC_RND(rnd_re, rnd_im);
+ break;
+ case MPFR_RND:
+ params->P[rnd_mode_index].mpfr_rnd =
+ next_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
+ break;
+ default:
+ printf ("The rounding mode is expected to be"
+ " the last input parameter.\n");
+ exit (-1);
+ }
+}
+
+int
+is_valid_rnd_mode (mpc_fun_param_t *params)
+/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
+{
+ mpfr_rnd_t rnd_re, rnd_im;
+ int rnd_mode_index = params->nbout + params->nbin - 1;
+ switch (params->T[rnd_mode_index])
+ {
+ case MPC_RND:
+ rnd_re = MPC_RND_RE (params->P[rnd_mode_index].mpc_rnd);
+ rnd_im = MPC_RND_IM (params->P[rnd_mode_index].mpc_rnd);
+ return is_valid_mpfr_rnd_mode (rnd_re)
+ && is_valid_mpfr_rnd_mode (rnd_im);
+ case MPFR_RND:
+ return is_valid_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
+ default:
+ printf ("The rounding mode is expected to be"
+ " the last input parameter.\n");
+ exit (-1);
+ }
+}
diff --git a/tests/templates.h b/tests/templates.h
index 8601cf4..5fc4d8f 100644
--- a/tests/templates.h
+++ b/tests/templates.h
@@ -210,4 +210,9 @@ void tpl_copy_mpz (mpz_ptr dest, mpz_srcptr src);
void tpl_copy_mpfr (mpfr_ptr dest, mpfr_srcptr src);
void tpl_copy_mpc (mpc_ptr dest, mpc_srcptr src);
+/* iterating over rounding modes */
+void first_rnd_mode (mpc_fun_param_t *params);
+int is_valid_rnd_mode (mpc_fun_param_t *params);
+void next_rnd_mode (mpc_fun_param_t *params);
+
#endif /*__TEMPLATES_H*/
diff --git a/tests/tgeneric.tpl b/tests/tgeneric.tpl
index befcc65..3689a7b 100644
--- a/tests/tgeneric.tpl
+++ b/tests/tgeneric.tpl
@@ -22,16 +22,11 @@ along with this program. If not, see http://www.gnu.org/licenses/ .
#error Define MPC_FUNCTION_CALL before including 'data_check.tpl'.
#endif
-#include "mpc-tests.h"
-
/* helper functions, defined after tgeneric */
static void set_output_precision (mpc_fun_param_t *params, mpfr_prec_t prec);
static void set_input_precision (mpc_fun_param_t *params, mpfr_prec_t prec);
static void set_reference_precision (mpc_fun_param_t *params,
mpfr_prec_t prec);
-static void first_rnd_mode (mpc_fun_param_t *params);
-static int is_valid_rnd_mode (mpc_fun_param_t *params);
-static void next_rnd_mode (mpc_fun_param_t *params);
static int double_rounding (mpc_fun_param_t *params);
static int count_special_cases (mpc_fun_param_t *params);
static void random_params (mpc_fun_param_t *params,
@@ -445,109 +440,3 @@ double_rounding (mpc_fun_param_t *params)
}
-/* helper functions for iterating over mpfr rounding modes */
-
-#define FIRST_MPFR_RND_MODE MPFR_RNDN
-
-static mpfr_rnd_t
-next_mpfr_rnd_mode (mpfr_rnd_t curr)
-{
- switch (curr)
- {
- case MPFR_RNDN:
- return MPFR_RNDZ;
- case MPFR_RNDZ:
- return MPFR_RNDU;
- case MPFR_RNDU:
- return MPFR_RNDD;
- default:
- /* return invalid guard value in mpfr_rnd_t */
-#if MPFR_VERSION_MAJOR < 3
- return MPFR_RNDNA;
-#else
- return MPFR_RNDA; /* valid rounding type, but not used in mpc */
-#endif
- }
-}
-
-static int
-is_valid_mpfr_rnd_mode (mpfr_rnd_t curr)
-/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
-{
- if ( curr == MPFR_RNDN || curr == MPFR_RNDZ
- || curr == MPFR_RNDU || curr == MPFR_RNDD)
- return 1;
- else
- return 0;
-}
-
-static void
-first_rnd_mode (mpc_fun_param_t *params)
-{
- int rnd_mode_index = params->nbout + params->nbin - 1;
- switch (params->T[rnd_mode_index])
- {
- case MPC_RND:
- params->P[rnd_mode_index].mpc_rnd =
- MPC_RND(FIRST_MPFR_RND_MODE, FIRST_MPFR_RND_MODE);
- break;
- case MPFR_RND:
- params->P[rnd_mode_index].mpfr_rnd = FIRST_MPFR_RND_MODE;
- break;
- default:
- printf ("The rounding mode is expected to be"
- " the last input parameter.\n");
- exit (-1);
- }
-}
-
-static void
-next_rnd_mode (mpc_fun_param_t *params)
-{
- mpfr_rnd_t rnd_re, rnd_im;
- int rnd_mode_index = params->nbout + params->nbin - 1;
- switch (params->T[rnd_mode_index])
- {
- case MPC_RND:
- rnd_re = MPC_RND_RE (params->P[rnd_mode_index].mpc_rnd);
- rnd_im = MPC_RND_IM (params->P[rnd_mode_index].mpc_rnd);
- rnd_im = next_mpfr_rnd_mode (rnd_im);
- if (!is_valid_mpfr_rnd_mode (rnd_im))
- {
- rnd_re = next_mpfr_rnd_mode (rnd_re);
- rnd_im = FIRST_MPFR_RND_MODE;
- }
- params->P[rnd_mode_index].mpc_rnd = MPC_RND(rnd_re, rnd_im);
- break;
- case MPFR_RND:
- params->P[rnd_mode_index].mpfr_rnd =
- next_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
- break;
- default:
- printf ("The rounding mode is expected to be"
- " the last input parameter.\n");
- exit (-1);
- }
-}
-
-static int
-is_valid_rnd_mode (mpc_fun_param_t *params)
-/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
-{
- mpfr_rnd_t rnd_re, rnd_im;
- int rnd_mode_index = params->nbout + params->nbin - 1;
- switch (params->T[rnd_mode_index])
- {
- case MPC_RND:
- rnd_re = MPC_RND_RE (params->P[rnd_mode_index].mpc_rnd);
- rnd_im = MPC_RND_IM (params->P[rnd_mode_index].mpc_rnd);
- return is_valid_mpfr_rnd_mode (rnd_re)
- && is_valid_mpfr_rnd_mode (rnd_im);
- case MPFR_RND:
- return is_valid_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
- default:
- printf ("The rounding mode is expected to be"
- " the last input parameter.\n");
- exit (-1);
- }
-}