diff options
author | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2013-12-02 17:17:09 +0000 |
---|---|---|
committer | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2013-12-02 17:17:09 +0000 |
commit | 016790506bc74378846496455ccaf6f328dca809 (patch) | |
tree | f35269c16f7d1942348c34170a5c4f28cf99f95b | |
parent | 0622de8c9f06a5579febd362da72639bd6e17e1f (diff) | |
download | mpc-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.am | 2 | ||||
-rw-r--r-- | tests/rounding.c | 131 | ||||
-rw-r--r-- | tests/templates.h | 5 | ||||
-rw-r--r-- | tests/tgeneric.tpl | 111 |
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); - } -} |