/* one operand, two results */ static void test3a (int (*testfunc)(mpfr_ptr, mpfr_ptr, mpfr_srcptr, mp_rnd_t), char *foo, mp_prec_t prec, mp_rnd_t rnd) { mpfr_t ref1, ref2, ref3; mpfr_t res1, res2; int i; #ifdef DEBUG printf ("checking %s\n", foo); #endif mpfr_init2 (ref1, prec); mpfr_init2 (ref2, prec); mpfr_init2 (ref3, prec); mpfr_init2 (res1, prec); mpfr_init2 (res2, prec); for (i=0; i<SPECIAL_MAX; i++) { set_special (ref3, i); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); /* foo(a, b, a) */ mpfr_set (res1, ref3, rnd); /* exact operation */ testfunc (res1, res2, res1, rnd); if (mpfr_compare (res1, ref1) || mpfr_compare (res2, ref2)) { printf ("Error for %s(a, b, a) for rnd=%s, ", foo, mpfr_print_rnd_mode (rnd)); DISP2("a=",ref3); DISP("expected (", ref1); DISP(",",ref2); DISP("), got (", res1); DISP(",", res2); printf(")\n"); exit (1); } /* foo(a, b, b) */ mpfr_set (res2, ref3, rnd); /* exact operation */ testfunc (res1, res2, res2, rnd); if (mpfr_compare (res1, ref1) || mpfr_compare (res2, ref2)) { printf ("Error for %s(a, b, b) for ", foo); DISP2("b=",ref3); DISP("expected (", ref1); DISP(",",ref2); DISP("), got (", res1); DISP(",", res2); printf(")\n"); exit (1); } } mpfr_clear (ref1); mpfr_clear (ref2); mpfr_clear (ref3); mpfr_clear (res1); mpfr_clear (res2); }
static void pow_int (mpfr_rnd_t rnd) { mpfr_t ref1, ref2, ref3; mpfr_t res1; int i; #ifdef DEBUG printf("pow_int\n"); #endif mpfr_inits2 ((randlimb () % 200) + MPFR_PREC_MIN, ref1, ref2, res1, (mpfr_ptr) 0); mpfr_init2 (ref3, 1005); for (i = 0; i <= 15; i++) { mpfr_urandomb (ref2, RANDS); if (i & 1) mpfr_neg (ref2, ref2, MPFR_RNDN); mpfr_set_ui (ref3, 20, MPFR_RNDN); /* We need to test huge integers because different algorithms/codes are used for not-too-large integers (mpfr_pow_z) and for general cases, in particular huge integers (mpfr_pow_general). [r7606] */ if (i & 2) mpfr_mul_2ui (ref3, ref3, 1000, MPFR_RNDN); if (i & 4) mpfr_add_ui (ref3, ref3, 1, MPFR_RNDN); /* odd integer */ /* reference call: pow(a, b, c) */ mpfr_pow (ref1, ref2, ref3, rnd); /* pow(a, a, c) */ mpfr_set (res1, ref2, rnd); /* exact operation */ mpfr_pow (res1, res1, ref3, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for pow_int(a, a, c) for "); DISP("a=",ref2); DISP2(", c=",ref3); printf ("expected "); mpfr_print_binary (ref1); puts (""); printf ("got "); mpfr_print_binary (res1); puts (""); exit (1); } } mpfr_clears (ref1, ref2, ref3, res1, (mpfr_ptr) 0); }
static void test2ui (int (*testfunc)(mpfr_ptr, mpfr_srcptr, unsigned long int, mp_rnd_t), char *foo, mp_prec_t prec, mp_rnd_t rnd) { mpfr_t ref1, ref2; unsigned int ref3; mpfr_t res1; int i; #ifdef DEBUG printf("checking %s\n", foo); #endif mpfr_init2 (ref1, prec); 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<SPECIAL_MAX*2; i++) { set_special (ref2, i%SPECIAL_MAX); ref3 = i/SPECIAL_MAX == 0 ? 0 : randlimb (); /* reference call: foo(a, b, c) */ testfunc (ref1, ref2, ref3, rnd); /* foo(a, a, c) */ mpfr_set (res1, ref2, rnd); /* exact operation */ testfunc (res1, res1, ref3, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, a, c) for c=%u\n", foo, ref3); DISP2("a=",ref2); printf ("expected "); mpfr_print_binary (ref1); puts (""); printf ("got "); mpfr_print_binary (res1); puts (""); exit (1); } } mpfr_clear (ref1); mpfr_clear (ref2); mpfr_clear (res1); }
static void testui2 (int (*testfunc)(mpfr_ptr, unsigned long int, mpfr_srcptr, mpfr_rnd_t), const char *foo, mpfr_prec_t prec, mpfr_rnd_t rnd) { mpfr_t ref1, ref3; unsigned int ref2; mpfr_t res1; int i; #ifdef DEBUG printf("checking %s\n", foo); #endif mpfr_init2 (ref1, prec); mpfr_init2 (ref3, prec); mpfr_init2 (res1, prec); 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); /* foo(a, b, a) */ mpfr_set (res1, ref3, rnd); /* exact operation */ testfunc (res1, ref2, res1, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, b, a) for b=%u \n", foo, ref2); DISP2("a=", ref3); DISP("expected", ref1); DISP2(", got ", res1); exit (1); } } mpfr_clear (ref1); mpfr_clear (ref3); mpfr_clear (res1); }
/* foo(mpfr_ptr, mpfr_srcptr) */ static void test2a (int (*testfunc)(mpfr_ptr, mpfr_srcptr), char *foo, mp_prec_t prec) { mpfr_t ref1, ref2; mpfr_t res1; int i; #ifdef DEBUG printf ("checking %s\n", foo); #endif mpfr_init2 (ref1, prec); mpfr_init2 (ref2, prec); mpfr_init2 (res1, prec); for (i=0; i<SPECIAL_MAX; i++) { set_special (ref2, i); /* reference call: foo(a, b) */ testfunc (ref1, ref2); /* foo(a, a) */ mpfr_set (res1, ref2, GMP_RNDN); /* exact operation */ testfunc (res1, res1); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, a) for ", foo); DISP2("a=",ref2); DISP("expected", ref1); DISP2(", got ", res1); exit (1); } } mpfr_clear (ref1); mpfr_clear (ref2); mpfr_clear (res1); }
static void test3 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t), char *foo, mp_prec_t prec, mp_rnd_t rnd) { mpfr_t ref1, ref2, ref3; mpfr_t res1; int i; #ifdef DEBUG printf("checking %s\n", foo); #endif mpfr_init2 (ref1, prec); mpfr_init2 (ref2, prec); mpfr_init2 (ref3, prec); mpfr_init2 (res1, prec); /* for each variable, consider each of the following 6 possibilities: NaN, +Infinity, -Infinity, +0, -0 or a random number */ 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); /* foo(a, a, c) */ mpfr_set (res1, ref2, rnd); /* exact operation */ testfunc (res1, res1, ref3, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, a, c) for ", foo); DISP("a=",ref2); DISP2(", c=",ref3); printf ("expected "); mpfr_print_binary (ref1); puts (""); printf ("got "); mpfr_print_binary (res1); puts (""); exit (1); } /* foo(a, b, a) */ mpfr_set (res1, ref3, rnd); testfunc (res1, ref2, res1, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, b, a) for ", foo); DISP("b=",ref2); DISP2(", a=", ref3); DISP("expected ", ref1); DISP2(", got ",res1); exit (1); } /* foo(a, a, a) */ mpfr_set (ref3, ref2, rnd); testfunc (ref1, ref2, ref3, rnd); mpfr_set (res1, ref2, rnd); testfunc (res1, res1, res1, rnd); if (mpfr_compare (res1, ref1)) { printf ("Error for %s(a, a, a) for ", foo); DISP2("a=",ref2); DISP("expected ", ref1); DISP2(", got", res1); exit (1); } } mpfr_clear (ref1); mpfr_clear (ref2); mpfr_clear (ref3); mpfr_clear (res1); }
static void test4 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t), char *foo, mp_prec_t prec, mp_rnd_t rnd) { mpfr_t ref, op1, op2, op3; mpfr_t res; int i, j, k; #ifdef DEBUG printf("checking %s\n", foo); #endif mpfr_init2 (ref, prec); mpfr_init2 (op1, prec); mpfr_init2 (op2, prec); mpfr_init2 (op3, prec); mpfr_init2 (res, prec); /* for each variable, consider each of the following 6 possibilities: NaN, +Infinity, -Infinity, +0, -0 or a random number */ for (i=0; i<SPECIAL_MAX; i++) { set_special (op1, i); for (j=0; j<SPECIAL_MAX; j++) { set_special (op2, j); for (k=0; k<SPECIAL_MAX; k++) { set_special (op3, k); /* reference call: foo(s, a, b, c) */ testfunc (ref, op1, op2, op3, rnd); /* foo(a, a, b, c) */ mpfr_set (res, op1, rnd); /* exact operation */ testfunc (res, res, op2, op3, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", b=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo(b, a, b, c) */ mpfr_set (res, op2, rnd); testfunc (res, op1, res, op3, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", b=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo(c, a, b, c) */ mpfr_set (res, op3, rnd); testfunc (res, op1, op2, res, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", b=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo(a, a, a,c) */ testfunc (ref, op1, op1, op3, rnd); mpfr_set (res, op1, rnd); testfunc (res, res, res, op3, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", a=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo(a, a, b,a) */ testfunc (ref, op1, op2, op1, rnd); mpfr_set (res, op1, rnd); testfunc (res, res, op2, res, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", a=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo(b, a, b, b) */ testfunc (ref, op1, op2, op2, rnd); mpfr_set (res, op2, rnd); testfunc (res, op1, res, res, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, b, c) for ", foo); DISP("a=", op1); DISP(", a=", op2); DISP2(", c=", op3); DISP("expected ", ref); DISP2(", got", res); exit (1); } /* foo (a, a, a, a) */ testfunc (ref, op1, op1, op1 ,rnd); mpfr_set (res, op1, rnd); testfunc (res, res, res, res, rnd); if (mpfr_compare (res, ref)) { printf ("Error for %s(a, a, a, a) for ", foo); DISP2("a=", op1); DISP("expected ", ref); DISP2(", got", res); exit (1); } } } } mpfr_clear (ref); mpfr_clear (op1); mpfr_clear (op2); mpfr_clear (op3); mpfr_clear (res); }