summaryrefslogtreecommitdiff
path: root/tests/rounding.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/rounding.c')
-rw-r--r--tests/rounding.c126
1 files changed, 92 insertions, 34 deletions
diff --git a/tests/rounding.c b/tests/rounding.c
index 603e627..86c4321 100644
--- a/tests/rounding.c
+++ b/tests/rounding.c
@@ -1,6 +1,6 @@
/* rounding.c -- file for functions iterating over rounding modes.
-Copyright (C) 2013 INRIA
+Copyright (C) 2013, 2014 INRIA
This file is part of GNU MPC.
@@ -56,21 +56,45 @@ is_valid_mpfr_rnd_mode (mpfr_rnd_t curr)
return 0;
}
+static mpc_rnd_t
+next_mpc_rnd_mode (mpc_rnd_t rnd)
+{
+ mpfr_rnd_t rnd_re = MPC_RND_RE (rnd);
+ mpfr_rnd_t rnd_im = MPC_RND_IM (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;
+ }
+
+ return MPC_RND(rnd_re, rnd_im);
+}
+
+static int
+is_valid_mpc_rnd_mode (mpc_rnd_t rnd)
+/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
+{
+ mpfr_rnd_t rnd_re = MPC_RND_RE (rnd);
+ mpfr_rnd_t rnd_im = MPC_RND_IM (rnd);
+
+ return is_valid_mpfr_rnd_mode (rnd_re) && is_valid_mpfr_rnd_mode (rnd_im);
+}
/* functions using abstract parameters */
-void
-first_rnd_mode (mpc_fun_param_t *params)
+static void
+first_mode (mpc_fun_param_t *params, int index)
{
- int rnd_mode_index = params->nbout + params->nbin - 1;
- switch (params->T[rnd_mode_index])
+ switch (params->T[index])
{
case MPC_RND:
- params->P[rnd_mode_index].mpc_rnd =
+ params->P[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;
+ params->P[index].mpfr_rnd = FIRST_MPFR_RND_MODE;
break;
default:
printf ("The rounding mode is expected to be"
@@ -79,27 +103,18 @@ first_rnd_mode (mpc_fun_param_t *params)
}
}
-void
-next_rnd_mode (mpc_fun_param_t *params)
+static void
+next_mode (mpc_fun_param_t *params, int index)
{
- mpfr_rnd_t rnd_re, rnd_im;
- int rnd_mode_index = params->nbout + params->nbin - 1;
- switch (params->T[rnd_mode_index])
+ switch (params->T[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);
+ params->P[index].mpc_rnd =
+ next_mpc_rnd_mode (params->P[index].mpc_rnd);
break;
case MPFR_RND:
- params->P[rnd_mode_index].mpfr_rnd =
- next_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
+ params->P[index].mpfr_rnd =
+ next_mpfr_rnd_mode (params->P[index].mpfr_rnd);
break;
default:
printf ("The rounding mode is expected to be"
@@ -108,24 +123,67 @@ next_rnd_mode (mpc_fun_param_t *params)
}
}
-int
-is_valid_rnd_mode (mpc_fun_param_t *params)
-/* returns 1 if curr is a valid rounding mode, and 0 otherwise */
+static int
+is_valid_mode (mpc_fun_param_t *params, int index)
+/* returns 1 if params->P[index] 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])
+ switch (params->T[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);
+ return is_valid_mpc_rnd_mode (params->P[index].mpc_rnd);
case MPFR_RND:
- return is_valid_mpfr_rnd_mode (params->P[rnd_mode_index].mpfr_rnd);
+ return is_valid_mpfr_rnd_mode (params->P[index].mpfr_rnd);
default:
printf ("The rounding mode is expected to be"
" the last input parameter.\n");
exit (-1);
}
}
+
+void
+first_rnd_mode (mpc_fun_param_t *params)
+{
+ int rnd_mode_index;
+
+ for (rnd_mode_index = params->nbout + params->nbin - params->nbrnd;
+ rnd_mode_index < params->nbout + params->nbin;
+ rnd_mode_index++)
+ {
+ first_mode (params, rnd_mode_index);
+ }
+}
+
+
+void
+next_rnd_mode (mpc_fun_param_t *params)
+/* cycle through all valid rounding modes and finish with an invalid one */
+{
+ int last = params->nbout + params->nbin - 1;
+ int index = params->nbout + params->nbin - params->nbrnd;
+ int carry = 1;
+
+ while (carry && index <= last) {
+ next_mode (params, index);
+ if (!is_valid_mode (params, index) && index < last)
+ first_mode (params, index);
+ else
+ carry = 0;
+ index++;
+ }
+}
+
+int
+is_valid_rnd_mode (mpc_fun_param_t *params)
+/* returns 1 if all rounding parameters are set to a valid rounding mode,
+ and 0 otherwise */
+{
+ int index;
+
+ for (index = params->nbout + params->nbin - params->nbrnd;
+ index < params->nbout + params->nbin;
+ index++)
+ if (! is_valid_mode (params, index))
+ return 0;
+
+ return 1;
+}