summaryrefslogtreecommitdiff
path: root/tests/tgeneric.tpl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tgeneric.tpl')
-rw-r--r--tests/tgeneric.tpl134
1 files changed, 0 insertions, 134 deletions
diff --git a/tests/tgeneric.tpl b/tests/tgeneric.tpl
index 008688f..1ce8079 100644
--- a/tests/tgeneric.tpl
+++ b/tests/tgeneric.tpl
@@ -23,7 +23,6 @@ along with this program. If not, see http://www.gnu.org/licenses/ .
#endif
/* helper functions, defined after tgeneric */
-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,
mpfr_exp_t exp_min, mpfr_exp_t exp_max,
@@ -295,136 +294,3 @@ random_params (mpc_fun_param_t *params,
}
}
}
-
-
-/* return 1 if double rounding occurs;
- return 0 otherwise */
-static int
-double_rounding_mpfr (mpfr_ptr lowprec,
- mpfr_ptr hiprec, int hiprec_inex, mpfr_rnd_t hiprec_rnd)
-{
- mpfr_exp_t hiprec_err;
- mpfr_rnd_t lowprec_rnd = hiprec_rnd;
- mpfr_prec_t lowprec_prec = mpfr_get_prec (lowprec);
-
- /* hiprec error is bounded by one ulp */
- hiprec_err = mpfr_get_prec (hiprec) - 1;
-
- if (hiprec_rnd == MPFR_RNDN)
- /* when rounding to nearest, use the trick for determining the
- correct ternary value which is described in MPFR
- documentation */
- {
- hiprec_err++; /* error is bounded by one half-ulp */
- lowprec_rnd = MPFR_RNDZ;
- lowprec_prec++;
- }
-
- return (hiprec_inex == 0
- || mpfr_can_round (hiprec, hiprec_err, hiprec_rnd,
- lowprec_rnd, lowprec_prec));
-}
-
-/* return 1 if double rounding occurs;
- return 0 otherwise */
-static int
-double_rounding_mpc (mpc_ptr lowprec,
- mpc_ptr hiprec, int hiprec_inex, mpc_rnd_t hiprec_rnd)
-{
- mpfr_ptr lowprec_re = mpc_realref (lowprec);
- mpfr_ptr lowprec_im = mpc_imagref (lowprec);
- mpfr_ptr hiprec_re = mpc_realref (hiprec);
- mpfr_ptr hiprec_im = mpc_imagref (hiprec);
- int inex_re = MPC_INEX_RE (hiprec_inex);
- int inex_im = MPC_INEX_IM (hiprec_inex);
- mpfr_rnd_t rnd_re = MPC_RND_RE (hiprec_rnd);
- mpfr_rnd_t rnd_im = MPC_RND_IM (hiprec_rnd);
-
- return (double_rounding_mpfr (lowprec_re, hiprec_re, inex_re, rnd_re)
- && double_rounding_mpfr (lowprec_im, hiprec_im, inex_im, rnd_im));
-}
-
-/* check whether double rounding occurs; if not, round extra precise output
- value and set reference parameter */
-static int
-double_rounding (mpc_fun_param_t *params)
-{
- int out;
- const int offset = params->nbout + params->nbin;
- const int rnd_index = params->nbout + params->nbin - 1;
-
- for (out = 0; out < params->nbout; out++) {
- if (params->T[out] == MPC)
- {
- MPC_ASSERT (params->T[0] == MPC_INEX);
- MPC_ASSERT (params->T[offset] == MPC_INEX);
- MPC_ASSERT (params->T[out + offset] == MPC);
- MPC_ASSERT (params->T[rnd_index] == MPC_RND);
-
- if (double_rounding_mpc (params->P[out + offset].mpc_data.mpc,
- params->P[out].mpc,
- params->P[0].mpc_inex,
- params->P[rnd_index].mpc_rnd))
- /* the hight-precision value and the exact value round to the same
- low-precision value */
- {
- int inex;
- inex = mpc_set (params->P[out + offset].mpc_data.mpc,
- params->P[out].mpc,
- params->P[rnd_index].mpc_rnd);
- params->P[out + offset].mpc_data.known_sign_real = -1;
- params->P[out + offset].mpc_data.known_sign_imag = -1;
-
- /* no double rounding means that the ternary value may comes from
- the high-precision calculation or from the rounding */
- if (MPC_INEX_RE (inex) == 0)
- params->P[offset].mpc_inex_data.real =
- MPC_INEX_RE (params->P[0].mpc_inex);
- else
- params->P[offset].mpc_inex_data.real = MPC_INEX_RE (inex);
- if (MPC_INEX_IM (inex) == 0)
- params->P[offset].mpc_inex_data.imag =
- MPC_INEX_IM (params->P[0].mpc_inex);
- else
- params->P[offset].mpc_inex_data.imag = MPC_INEX_IM (inex);
- }
- else
- /* double rounding occurs */
- return 1;
- }
- else if (params->T[out] == MPFR)
- {
- MPC_ASSERT (params->T[0] == MPFR_INEX);
- MPC_ASSERT (params->T[offset] == MPFR_INEX);
- MPC_ASSERT (params->T[out + offset] == MPFR);
- MPC_ASSERT (params->T[rnd_index] == MPFR_RND);
-
- if (double_rounding_mpfr (params->P[out + offset].mpfr_data.mpfr,
- params->P[out].mpfr,
- params->P[0].mpfr_inex,
- params->P[rnd_index].mpfr_rnd))
- /* the hight-precision value and the exact value round to the same
- low-precision value */
- {
- int inex;
- inex = mpfr_set (params->P[out + offset].mpfr_data.mpfr,
- params->P[out].mpfr,
- params->P[rnd_index].mpfr_rnd);
- params->P[out + offset].mpfr_data.known_sign = -1;
-
- /* no double rounding means that the ternary value may comes from
- the high-precision calculation or from the rounding */
- if (inex == 0)
- params->P[offset].mpfr_inex = params->P[0].mpfr_inex;
- else
- params->P[offset].mpfr_inex = inex;
- }
- else
- /* double rounding occurs */
- return 1;
- }
- }
- return 0;
-}
-
-