summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-02 16:47:36 +0000
committerthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-02 16:47:36 +0000
commit0ffd847b15b2aed098e41feedc98ea25afc9465f (patch)
treedb31d6115b4f3e29cf2b86e8c5d7296b45487a22
parent737d897d29871eb439efb90db2f88d51bbb03ba5 (diff)
downloadmpc-0ffd847b15b2aed098e41feedc98ea25afc9465f.tar.gz
[tests\] Add random generators for mpfr_t and mpc_t parameter.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/branches/benchs_tests@1345 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r--tests/random.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/random.c b/tests/random.c
index 0730fee..5fb7adf 100644
--- a/tests/random.c
+++ b/tests/random.c
@@ -158,3 +158,74 @@ test_default_random (mpc_ptr z, mpfr_exp_t emin, mpfr_exp_t emax,
if (((r>>8) & 0xFF) < negative_probability)
mpfr_neg (mpc_imagref (z), mpc_imagref (z), MPFR_RNDN);
}
+
+/* Set x to a non zero value random value with absolute values greater than
+ or equal to 2^{emin-1} and less than 2^emax.
+
+ x is negative with probability equal to NEGATIVE_PROBABILITY / 256.
+*/
+void
+test_random_mpfr (mpfr_ptr x, mpfr_exp_t emin, mpfr_exp_t emax,
+ unsigned int negative_probability)
+{
+ const unsigned long range = (unsigned long int) (emax - emin) + 1;
+ unsigned long r;
+
+ if (!rands_initialized)
+ {
+ fprintf (stderr,
+ "Put test_start at the beginning of your test function.\n");
+ exit (1);
+ }
+
+ do
+ {
+ mpfr_urandom (x, rands, MPFR_RNDN);
+ } while (mpfr_zero_p (x));
+
+ mpfr_set_exp (x, (mpfr_exp_t) gmp_urandomm_ui (rands, range) + emin);
+ if (negative_probability > 256)
+ negative_probability = 256;
+ r = gmp_urandomb_ui (rands, 8);
+ if ((r & 0xFF) < negative_probability)
+ mpfr_neg (x, x, MPFR_RNDN);
+}
+
+/* Set z to a non zero value random value with absolute values of Re(z) and
+ Im(z) greater than or equal to 2^{emin-1} and less than 2^emax.
+
+ Each part is negative with probability equal to NEGATIVE_PROBABILITY / 256.
+*/
+void
+test_random_mpc (mpc_ptr z, mpfr_exp_t emin, mpfr_exp_t emax,
+ unsigned int negative_probability)
+{
+ const unsigned long range = (unsigned long int) (emax - emin) + 1;
+ unsigned long r;
+
+ if (!rands_initialized)
+ {
+ fprintf (stderr,
+ "Put test_start at the beginning of your test function.\n");
+ exit (1);
+ }
+
+ do
+ {
+ mpc_urandom (z, rands);
+ } while (mpfr_zero_p (mpc_realref (z)) || mpfr_zero_p (mpc_imagref (z)));
+
+ mpfr_set_exp (mpc_realref (z),
+ (mpfr_exp_t) gmp_urandomm_ui (rands, range) + emin);
+
+ mpfr_set_exp (mpc_imagref (z),
+ (mpfr_exp_t) gmp_urandomm_ui (rands, range) + emin);
+
+ if (negative_probability > 256)
+ negative_probability = 256;
+ r = gmp_urandomb_ui (rands, 16);
+ if ((r & 0xFF) < negative_probability)
+ mpfr_neg (mpc_realref (z), mpc_realref (z), MPFR_RNDN);
+ if (((r>>8) & 0xFF) < negative_probability)
+ mpfr_neg (mpc_imagref (z), mpc_imagref (z), MPFR_RNDN);
+}