diff options
author | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-02-04 10:10:37 +0000 |
---|---|---|
committer | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-02-04 10:10:37 +0000 |
commit | 1f416f0f958c6fcad2068a47a549db9fe5caf16a (patch) | |
tree | 28064f6c7f1f2af9496e0ee7a05a1adb6a96fe8a /tests/reuse.c | |
parent | 2dd08bcfd72e852b8ef5b8404042af798111132c (diff) | |
download | mpfr-1f416f0f958c6fcad2068a47a549db9fe5caf16a.tar.gz |
Improve reuse tests (Include 1, -1, 1/2, 2, PI and PI/2 now).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3277 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests/reuse.c')
-rw-r--r-- | tests/reuse.c | 279 |
1 files changed, 125 insertions, 154 deletions
diff --git a/tests/reuse.c b/tests/reuse.c index 079239a28..c5d86d36a 100644 --- a/tests/reuse.c +++ b/tests/reuse.c @@ -27,6 +27,57 @@ MA 02111-1307, USA. */ #define DISP(s, t) {printf(s); mpfr_out_str(stdout, 10, 0, t, GMP_RNDN); } #define DISP2(s,t) {DISP(s,t); putchar('\n');} +#define SPECIAL_MAX 12 + +static void +set_special (mpfr_ptr x, unsigned int select) +{ + MPFR_ASSERTN (select < SPECIAL_MAX); + switch (select) + { + case 0: + MPFR_SET_NAN (x); + break; + case 1: + MPFR_SET_INF (x); + MPFR_SET_POS (x); + break; + case 2: + MPFR_SET_INF (x); + MPFR_SET_NEG (x); + break; + case 3: + MPFR_SET_ZERO (x); + MPFR_SET_POS (x); + break; + case 4: + MPFR_SET_ZERO (x); + MPFR_SET_NEG (x); + break; + case 5: + mpfr_set_str_binary (x, "1"); + break; + case 6: + mpfr_set_str_binary (x, "-1"); + break; + case 7: + mpfr_set_str_binary (x, "1e-1"); + break; + case 8: + mpfr_set_str_binary (x, "1e+1"); + break; + case 9: + mpfr_const_pi (x, GMP_RNDN); + break; + case 10: + mpfr_const_pi (x, GMP_RNDN); + MPFR_SET_EXP (x, MPFR_GET_EXP (x)-1); + break; + default: + mpfr_random (x); + break; + } +} /* same than mpfr_cmp, but returns 0 for both NaN's */ static int mpfr_compare (mpfr_srcptr a, mpfr_srcptr b) @@ -36,20 +87,6 @@ mpfr_compare (mpfr_srcptr a, mpfr_srcptr b) } static void -mpfr_set_pos_zero(mpfr_t a) -{ - MPFR_SET_ZERO(a); - MPFR_SET_POS(a); -} - -static void -mpfr_set_neg_zero(mpfr_t a) -{ - MPFR_SET_ZERO(a); - MPFR_SET_NEG(a); -} - -static void test3 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t), char *foo, mp_prec_t prec, mp_rnd_t rnd) { @@ -67,20 +104,9 @@ test3 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t), /* for each variable, consider each of the following 6 possibilities: NaN, +Infinity, -Infinity, +0, -0 or a random number */ - for (i=0; i<36; i++) { - if (i%6==0) mpfr_set_nan (ref2); - if (i%6==1) mpfr_set_inf (ref2, 1); - if (i%6==2) mpfr_set_inf (ref2, -1); - if (i%6==3) mpfr_set_pos_zero (ref2); - if (i%6==4) mpfr_set_neg_zero (ref2); - if (i%6==5) mpfr_random (ref2); - - if (i/6==0) mpfr_set_nan (ref3); - if (i/6==1) mpfr_set_inf (ref3, 1); - if (i/6==2) mpfr_set_inf (ref3, -1); - if (i/6==3) mpfr_set_pos_zero (ref3); - if (i/6==4) mpfr_set_neg_zero (ref3); - if (i/6==5) mpfr_random (ref3); + for (i=0; i < SPECIAL_MAX*SPECIAL_MAX ; i++) { + set_special (ref2, i%SPECIAL_MAX); + set_special (ref3, i/SPECIAL_MAX); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); @@ -151,35 +177,15 @@ test4 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, /* for each variable, consider each of the following 6 possibilities: NaN, +Infinity, -Infinity, +0, -0 or a random number */ - for (i=0; i<6; i++) + for (i=0; i<SPECIAL_MAX; i++) { - MPFR_CLEAR_FLAGS(op1); - if (i==0) mpfr_set_nan (op1); - if (i==1) mpfr_set_inf (op1, 1); - if (i==2) mpfr_set_inf (op1, -1); - if (i==3) mpfr_set_pos_zero (op1); - if (i==4) mpfr_set_neg_zero (op1); - if (i==5) mpfr_random (op1); - - for (j=0; j<6; j++) + set_special (op1, i); + for (j=0; j<SPECIAL_MAX; j++) { - MPFR_CLEAR_FLAGS(op2); - if (j==0) mpfr_set_nan (op2); - if (j==1) mpfr_set_inf (op2, 1); - if (j==2) mpfr_set_inf (op2, -1); - if (j==3) mpfr_set_pos_zero (op2); - if (j==4) mpfr_set_neg_zero (op2); - if (j==5) mpfr_random (op2); - - for (k=0; k<6; k++) + set_special (op2, j); + for (k=0; k<SPECIAL_MAX; k++) { - MPFR_CLEAR_FLAGS(op3); - if (k==0) mpfr_set_nan (op3); - if (k==1) mpfr_set_inf (op3, 1); - if (k==2) mpfr_set_inf (op3, -1); - if (k==3) mpfr_set_pos_zero (op3); - if (k==4) mpfr_set_neg_zero (op3); - if (k==5) mpfr_random (op3); + set_special (op3, k); /* reference call: foo(s, a, b, c) */ testfunc (ref, op1, op2, op3, rnd); @@ -285,7 +291,6 @@ test2ui (int (*testfunc)(mpfr_ptr, mpfr_srcptr, unsigned long int, mp_rnd_t), { mpfr_t ref1, ref2; unsigned int ref3; - mp_limb_t c[1]; mpfr_t res1; int i; @@ -296,26 +301,12 @@ test2ui (int (*testfunc)(mpfr_ptr, mpfr_srcptr, unsigned long int, mp_rnd_t), mpfr_init2 (ref2, prec); mpfr_init2 (res1, prec); - - /* ref2 can be NaN, +Inf, -Inf, +0, -0 or any number ref3 can be 0 or any number */ - for (i=0; i<12; i++) + for (i=0; i<SPECIAL_MAX*2; i++) { - if (i%6==0) mpfr_set_nan (ref2); - if (i%6==1) mpfr_set_inf (ref2, 1); - if (i%6==2) mpfr_set_inf (ref2, -1); - if (i%6==3) mpfr_set_pos_zero (ref2); - if (i%6==4) mpfr_set_neg_zero (ref2); - if (i%6==5) mpfr_random (ref2); - - if (i/6==0) - ref3=0; - else - { - mpn_random (c, 1); - ref3 = (unsigned int) c[0]; - } + set_special (ref2, i%SPECIAL_MAX); + ref3 = i/SPECIAL_MAX == 0 ? 0 : randlimb (); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); @@ -345,7 +336,6 @@ testui2 (int (*testfunc)(mpfr_ptr, unsigned long int, mpfr_srcptr, mp_rnd_t), { mpfr_t ref1, ref3; unsigned int ref2; - mp_limb_t c[1]; mpfr_t res1; int i; @@ -355,23 +345,10 @@ testui2 (int (*testfunc)(mpfr_ptr, unsigned long int, mpfr_srcptr, mp_rnd_t), mpfr_init2 (ref1, prec); mpfr_init2 (ref3, prec); mpfr_init2 (res1, prec); - mpfr_random (ref3); - mpn_random (c, 1); - ref2 = (unsigned int) c[0]; - - for (i=0; i<12; i++) { - if (i%6==0) mpfr_set_nan (ref3); - if (i%6==1) mpfr_set_inf (ref3, 1); - if (i%6==2) mpfr_set_inf (ref3, -1); - if (i%6==3) mpfr_set_pos_zero (ref3); - if (i%6==4) mpfr_set_neg_zero (ref3); - if (i%6==5) mpfr_random (ref3); - - if (i/6==0) ref2=0; - else { - mpn_random (c, 1); - ref2 = (unsigned int) c[0]; - } + + for (i=0; i<SPECIAL_MAX*2; i++) { + set_special (ref3, i%SPECIAL_MAX); + ref2 = i/SPECIAL_MAX==0 ? 0 : randlimb (); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); @@ -408,16 +385,10 @@ test2 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mp_rnd_t), mpfr_init2 (ref1, prec); mpfr_init2 (ref2, prec); mpfr_init2 (res1, prec); - mpfr_random (ref2); - for (i=0; i<6; i++) + for (i=0; i<SPECIAL_MAX; i++) { - if (i==0) mpfr_set_nan (ref2); - if (i==1) mpfr_set_inf (ref2, 1); - if (i==2) mpfr_set_inf (ref2, -1); - if (i==3) mpfr_set_pos_zero (ref2); - if (i==4) mpfr_set_neg_zero (ref2); - if (i==5) mpfr_random (ref2); + set_special (ref2, i); /* reference call: foo(a, b) */ testfunc (ref1, ref2, rnd); @@ -454,16 +425,10 @@ test2a (int (*testfunc)(mpfr_ptr, mpfr_srcptr), mpfr_init2 (ref1, prec); mpfr_init2 (ref2, prec); mpfr_init2 (res1, prec); - mpfr_random (ref2); - for (i=0; i<6; i++) + for (i=0; i<SPECIAL_MAX; i++) { - if (i==0) mpfr_set_nan (ref2); - if (i==1) mpfr_set_inf (ref2, 1); - if (i==2) mpfr_set_inf (ref2, -1); - if (i==3) mpfr_set_pos_zero (ref2); - if (i==4) mpfr_set_neg_zero (ref2); - if (i==5) mpfr_random (ref2); + set_special (ref2, i); /* reference call: foo(a, b) */ testfunc (ref1, ref2); @@ -503,16 +468,10 @@ test3a (char *foo, mp_prec_t prec, mp_rnd_t rnd) mpfr_init2 (ref3, prec); mpfr_init2 (res1, prec); mpfr_init2 (res2, prec); - mpfr_random (ref3); - for (i=0; i<6; i++) + for (i=0; i<SPECIAL_MAX; i++) { - if (i==0) mpfr_set_nan (ref3); - if (i==1) mpfr_set_inf (ref3, 1); - if (i==2) mpfr_set_inf (ref3, -1); - if (i==3) mpfr_set_pos_zero (ref3); - if (i==4) mpfr_set_neg_zero (ref3); - if (i==5) mpfr_random (ref3); + set_special (ref3, i); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); @@ -561,49 +520,61 @@ reldiff_wrapper (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode) int main (void) { + mp_rnd_t rnd; + mp_prec_t p; MPFR_TEST_USE_RANDS (); tests_start_mpfr (); - test3 (mpfr_add, "mpfr_add", 53, GMP_RNDN); - test2ui (mpfr_add_ui, "mpfr_add_ui", 53, GMP_RNDN); - test3 (mpfr_agm, "mpfr_agm", 53, GMP_RNDN); - test2a (mpfr_ceil, "mpfr_ceil", 53); - test3 (mpfr_div, "mpfr_div", 53, GMP_RNDN); - test2ui (mpfr_div_2exp, "mpfr_div_2exp", 53, GMP_RNDN); - test2ui (mpfr_div_ui, "mpfr_div_ui", 53, GMP_RNDN); - test2 (mpfr_exp, "mpfr_exp", 53, GMP_RNDN); - test2a (mpfr_floor, "mpfr_floor", 53); - test2 (mpfr_log, "mpfr_log", 53, GMP_RNDN); - test3 (mpfr_mul, "mpfr_mul", 53, GMP_RNDN); - test2ui (mpfr_mul_2exp, "mpfr_mul_2exp", 53, GMP_RNDN); - test2ui (mpfr_mul_ui, "mpfr_mul_ui", 53, GMP_RNDN); - test2 (mpfr_neg, "mpfr_neg", 53, GMP_RNDN); - test2ui (mpfr_pow_ui, "mpfr_pow_ui", 53, GMP_RNDN); - test3 (reldiff_wrapper, "mpfr_reldiff", 53, GMP_RNDN); - test3 (mpfr_sub, "mpfr_sub", 53, GMP_RNDN); - test2ui (mpfr_sub_ui, "mpfr_sub_ui", 53, GMP_RNDN); - test2 (mpfr_sqrt, "mpfr_sqrt", 53, GMP_RNDN); - testui2 (mpfr_ui_div, "mpfr_ui_div", 53, GMP_RNDN); - testui2 (mpfr_ui_sub, "mpfr_ui_sub", 53, GMP_RNDN); - test2a (mpfr_trunc, "mpfr_trunc", 53); - test2 (mpfr_asin, "mpfr_asin", 53, GMP_RNDN); - test2 (mpfr_acos, "mpfr_acos", 53, GMP_RNDN); - test2 (mpfr_atan, "mpfr_atan", 53, GMP_RNDN); - test2 (mpfr_sinh, "mpfr_sinh", 53, GMP_RNDN); - test2 (mpfr_cosh, "mpfr_cosh", 53, GMP_RNDN); - test2 (mpfr_tanh, "mpfr_tanh", 53, GMP_RNDN); - test2 (mpfr_asinh, "mpfr_asinh", 53, GMP_RNDN); - test2 (mpfr_acosh, "mpfr_acosh", 53, GMP_RNDN); - test2 (mpfr_atanh, "mpfr_atanh", 53, GMP_RNDN); - test2 (mpfr_exp2, "mpfr_exp2", 53, GMP_RNDN); - test2 (mpfr_cos, "mpfr_cos", 53, GMP_RNDN); - test2 (mpfr_sin, "mpfr_sin", 53, GMP_RNDN); - test2 (mpfr_tan, "mpfr_tan", 53, GMP_RNDN); - test2 (mpfr_log10, "mpfr_log10", 53, GMP_RNDN); - test2 (mpfr_log2, "mpfr_log2", 53, GMP_RNDN); - test2 (mpfr_zeta, "mpfr_zeta", 53, GMP_RNDN); - test3 (mpfr_pow, "mpfr_pow", 53, GMP_RNDN); - test4 (mpfr_fma, "mpfr_fma", 53, GMP_RNDN); + p = (randlimb () % 200)+ MPFR_PREC_MIN; + for (rnd = GMP_RNDN ; rnd < GMP_RND_MAX ; (mp_rnd_t) ((int) rnd++)) { + test3 (mpfr_add, "mpfr_add", p, rnd); + test3 (mpfr_sub, "mpfr_sub", p, rnd); + test3 (mpfr_mul, "mpfr_mul", p, rnd); + test3 (mpfr_div, "mpfr_div", p, rnd); + + test3 (mpfr_agm, "mpfr_agm", p, rnd); + test3 (reldiff_wrapper, "mpfr_reldiff", p, rnd); + + test2a (mpfr_ceil, "mpfr_ceil", p); + test2a (mpfr_floor, "mpfr_floor", p); + test2a (mpfr_trunc, "mpfr_trunc", p); + + test2ui (mpfr_add_ui, "mpfr_add_ui", p, rnd); + test2ui (mpfr_mul_2exp, "mpfr_mul_2exp", p, rnd); + test2ui (mpfr_mul_ui, "mpfr_mul_ui", p, rnd); + test2ui (mpfr_pow_ui, "mpfr_pow_ui", p, rnd); + test2ui (mpfr_sub_ui, "mpfr_sub_ui", p, rnd); + test2ui (mpfr_div_2exp, "mpfr_div_2exp", p, rnd); + test2ui (mpfr_div_ui, "mpfr_div_ui", p, rnd); + + testui2 (mpfr_ui_div, "mpfr_ui_div", p, rnd); + testui2 (mpfr_ui_sub, "mpfr_ui_sub", p, rnd); + + test2 (mpfr_sqrt, "mpfr_sqrt", p, rnd); + test2 (mpfr_neg, "mpfr_neg", p, rnd); + test2 (mpfr_log, "mpfr_log", p, rnd); + test2 (mpfr_exp, "mpfr_exp", p, rnd); + test2 (mpfr_asin, "mpfr_asin", p, rnd); + test2 (mpfr_acos, "mpfr_acos", p, rnd); + test2 (mpfr_atan, "mpfr_atan", p, rnd); + test2 (mpfr_sinh, "mpfr_sinh", p, rnd); + test2 (mpfr_cosh, "mpfr_cosh", p, rnd); + test2 (mpfr_tanh, "mpfr_tanh", p, rnd); + test2 (mpfr_asinh, "mpfr_asinh", p, rnd); + test2 (mpfr_acosh, "mpfr_acosh", p, rnd); + test2 (mpfr_atanh, "mpfr_atanh", p, rnd); + test2 (mpfr_exp2, "mpfr_exp2", p, rnd); + test2 (mpfr_cos, "mpfr_cos", p, rnd); + test2 (mpfr_sin, "mpfr_sin", p, rnd); + test2 (mpfr_tan, "mpfr_tan", p, rnd); + test2 (mpfr_log10, "mpfr_log10", p, rnd); + test2 (mpfr_log2, "mpfr_log2", p, rnd); + test2 (mpfr_zeta, "mpfr_zeta", p, rnd); + test2 (mpfr_gamma, "mpfr_gamma", p, rnd); + test3 (mpfr_pow, "mpfr_pow", p, rnd); + + test4 (mpfr_fma, "mpfr_fma", p, rnd); + } tests_end_mpfr (); return 0; |