/* Usage: tzeta - generic tests tzeta s prec rnd_mode - compute zeta(s) with precision 'prec' and rounding mode 'mode' */ int main (int argc, char *argv[]) { mpfr_t s, y, z; mpfr_prec_t prec; mpfr_rnd_t rnd_mode; int inex; tests_start_mpfr (); if (argc != 1 && argc != 4) { printf ("Usage: tzeta\n" " or tzeta s prec rnd_mode\n"); exit (1); } if (argc == 4) { prec = atoi(argv[2]); mpfr_init2 (s, prec); mpfr_init2 (z, prec); mpfr_set_str (s, argv[1], 10, MPFR_RNDN); rnd_mode = (mpfr_rnd_t) atoi(argv[3]); mpfr_zeta (z, s, rnd_mode); mpfr_out_str (stdout, 10, 0, z, MPFR_RNDN); printf ("\n"); mpfr_clear (s); mpfr_clear (z); return 0; } test1(); mpfr_init2 (s, MPFR_PREC_MIN); mpfr_init2 (y, MPFR_PREC_MIN); mpfr_init2 (z, MPFR_PREC_MIN); /* the following seems to loop */ mpfr_set_prec (s, 6); mpfr_set_prec (z, 6); mpfr_set_str_binary (s, "1.10010e4"); mpfr_zeta (z, s, MPFR_RNDZ); mpfr_set_prec (s, 53); mpfr_set_prec (y, 53); mpfr_set_prec (z, 53); mpfr_set_ui (s, 1, MPFR_RNDN); mpfr_clear_divby0(); mpfr_zeta (z, s, MPFR_RNDN); if (!mpfr_inf_p (z) || MPFR_SIGN (z) < 0 || !mpfr_divby0_p()) { printf ("Error in mpfr_zeta for s = 1 (should be +inf) with divby0 flag\n"); exit (1); } mpfr_set_str_binary (s, "0.1100011101110111111111111010000110010111001011001011"); mpfr_set_str_binary (y, "-0.11111101111011001001001111111000101010000100000100100E2"); mpfr_zeta (z, s, MPFR_RNDN); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (1,RNDN)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDZ); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (1,RNDZ)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDU); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (1,RNDU)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDD); mpfr_nexttoinf (y); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (1,RNDD)\n"); exit (1); } mpfr_set_str_binary (s, "0.10001011010011100110010001100100001011000010011001011"); mpfr_set_str_binary (y, "-0.11010011010010101101110111011010011101111101111010110E1"); mpfr_zeta (z, s, MPFR_RNDN); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (2,RNDN)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDZ); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (2,RNDZ)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDU); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (2,RNDU)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDD); mpfr_nexttoinf (y); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (2,RNDD)\n"); exit (1); } mpfr_set_str_binary (s, "0.1100111110100001111110111000110101111001011101000101"); mpfr_set_str_binary (y, "-0.10010111010110000111011111001101100001111011000001010E3"); mpfr_zeta (z, s, MPFR_RNDN); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (3,RNDN)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDD); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (3,RNDD)\n"); exit (1); } mpfr_nexttozero (y); mpfr_zeta (z, s, MPFR_RNDZ); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (3,RNDZ)\n"); exit (1); } mpfr_zeta (z, s, MPFR_RNDU); if (mpfr_cmp (z, y) != 0) { printf ("Error in mpfr_zeta (3,RNDU)\n"); exit (1); } mpfr_set_str (s, "-400000001", 10, MPFR_RNDZ); mpfr_zeta (z, s, MPFR_RNDN); if (!(mpfr_inf_p (z) && MPFR_SIGN(z) < 0)) { printf ("Error in mpfr_zeta (-400000001)\n"); exit (1); } mpfr_set_str (s, "-400000003", 10, MPFR_RNDZ); mpfr_zeta (z, s, MPFR_RNDN); if (!(mpfr_inf_p (z) && MPFR_SIGN(z) > 0)) { printf ("Error in mpfr_zeta (-400000003)\n"); exit (1); } mpfr_set_prec (s, 34); mpfr_set_prec (z, 34); mpfr_set_str_binary (s, "-1.111111100001011110000010001010000e-35"); mpfr_zeta (z, s, MPFR_RNDD); mpfr_set_str_binary (s, "-1.111111111111111111111111111111111e-2"); if (mpfr_cmp (s, z)) { printf ("Error in mpfr_zeta, prec=34, MPFR_RNDD\n"); mpfr_dump (z); exit (1); } /* bug found by nightly tests on June 7, 2007 */ mpfr_set_prec (s, 23); mpfr_set_prec (z, 25); mpfr_set_str_binary (s, "-1.0110110110001000000000e-27"); mpfr_zeta (z, s, MPFR_RNDN); mpfr_set_prec (s, 25); mpfr_set_str_binary (s, "-1.111111111111111111111111e-2"); if (mpfr_cmp (s, z)) { printf ("Error in mpfr_zeta, prec=25, MPFR_RNDN\n"); printf ("expected "); mpfr_dump (s); printf ("got "); mpfr_dump (z); exit (1); } /* bug reported by Kevin Rauch on 26 Oct 2007 */ mpfr_set_prec (s, 128); mpfr_set_prec (z, 128); mpfr_set_str_binary (s, "-0.1000000000000000000000000000000000000000000000000000000000000001E64"); inex = mpfr_zeta (z, s, MPFR_RNDN); MPFR_ASSERTN (mpfr_inf_p (z) && MPFR_SIGN (z) < 0 && inex < 0); inex = mpfr_zeta (z, s, MPFR_RNDU); mpfr_set_inf (s, -1); mpfr_nextabove (s); MPFR_ASSERTN (mpfr_equal_p (z, s) && inex > 0); mpfr_clear (s); mpfr_clear (y); mpfr_clear (z); test_generic (2, 70, 5); test2 (); tests_end_mpfr (); return 0; }
static void check_set (void) { mpfr_clear_flags (); mpfr_set_overflow (); MPFR_ASSERTN ((mpfr_overflow_p) ()); mpfr_set_underflow (); MPFR_ASSERTN ((mpfr_underflow_p) ()); mpfr_set_divby0 (); MPFR_ASSERTN ((mpfr_divby0_p) ()); mpfr_set_nanflag (); MPFR_ASSERTN ((mpfr_nanflag_p) ()); mpfr_set_inexflag (); MPFR_ASSERTN ((mpfr_inexflag_p) ()); mpfr_set_erangeflag (); MPFR_ASSERTN ((mpfr_erangeflag_p) ()); MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL); mpfr_clear_overflow (); MPFR_ASSERTN (! (mpfr_overflow_p) ()); mpfr_clear_underflow (); MPFR_ASSERTN (! (mpfr_underflow_p) ()); mpfr_clear_divby0 (); MPFR_ASSERTN (! (mpfr_divby0_p) ()); mpfr_clear_nanflag (); MPFR_ASSERTN (! (mpfr_nanflag_p) ()); mpfr_clear_inexflag (); MPFR_ASSERTN (! (mpfr_inexflag_p) ()); mpfr_clear_erangeflag (); MPFR_ASSERTN (! (mpfr_erangeflag_p) ()); MPFR_ASSERTN (__gmpfr_flags == 0); (mpfr_set_overflow) (); MPFR_ASSERTN (mpfr_overflow_p ()); (mpfr_set_underflow) (); MPFR_ASSERTN (mpfr_underflow_p ()); (mpfr_set_divby0) (); MPFR_ASSERTN (mpfr_divby0_p ()); (mpfr_set_nanflag) (); MPFR_ASSERTN (mpfr_nanflag_p ()); (mpfr_set_inexflag) (); MPFR_ASSERTN (mpfr_inexflag_p ()); (mpfr_set_erangeflag) (); MPFR_ASSERTN (mpfr_erangeflag_p ()); MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL); (mpfr_clear_overflow) (); MPFR_ASSERTN (! mpfr_overflow_p ()); (mpfr_clear_underflow) (); MPFR_ASSERTN (! mpfr_underflow_p ()); (mpfr_clear_divby0) (); MPFR_ASSERTN (! mpfr_divby0_p ()); (mpfr_clear_nanflag) (); MPFR_ASSERTN (! mpfr_nanflag_p ()); (mpfr_clear_inexflag) (); MPFR_ASSERTN (! mpfr_inexflag_p ()); (mpfr_clear_erangeflag) (); MPFR_ASSERTN (! mpfr_erangeflag_p ()); MPFR_ASSERTN (__gmpfr_flags == 0); }
int main (int argc, char *argv[]) { #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0) unsigned int prec, yprec; int rnd; mpfr_t x, y, z, t; unsigned long n; int inex; tests_start_mpfr (); mpfr_init (x); mpfr_init (y); mpfr_init (z); mpfr_init (t); if (argc >= 3) /* tzeta_ui n prec [rnd] */ { mpfr_set_prec (x, atoi (argv[2])); mpfr_zeta_ui (x, atoi (argv[1]), argc > 3 ? (mpfr_rnd_t) atoi (argv[3]) : MPFR_RNDN); mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); printf ("\n"); goto clear_and_exit; } mpfr_set_prec (x, 33); mpfr_set_prec (y, 33); mpfr_zeta_ui (x, 3, MPFR_RNDZ); mpfr_set_str_binary (y, "0.100110011101110100000000001001111E1"); if (mpfr_cmp (x, y)) { printf ("Error for zeta(3), prec=33, MPFR_RNDZ\n"); printf ("expected "); mpfr_dump (y); printf ("got "); mpfr_dump (x); exit (1); } mpfr_clear_divby0 (); inex = mpfr_zeta_ui (x, 0, MPFR_RNDN); MPFR_ASSERTN (inex == 0 && mpfr_cmp_si_2exp (x, -1, -1) == 0 && !mpfr_divby0_p ()); mpfr_clear_divby0 (); inex = mpfr_zeta_ui (x, 1, MPFR_RNDN); MPFR_ASSERTN (inex == 0 && MPFR_IS_INF (x) && MPFR_IS_POS (x) && mpfr_divby0_p ()); for (prec = MPFR_PREC_MIN; prec <= 100; prec++) { mpfr_set_prec (x, prec); mpfr_set_prec (z, prec); mpfr_set_prec (t, prec); yprec = prec + 10; mpfr_set_prec (y, yprec); for (n = 0; n < 50; n++) for (rnd = 0; rnd < MPFR_RND_MAX; rnd++) { mpfr_zeta_ui (y, n, MPFR_RNDN); if (mpfr_can_round (y, yprec, MPFR_RNDN, MPFR_RNDZ, prec + (rnd == MPFR_RNDN))) { mpfr_set (t, y, (mpfr_rnd_t) rnd); mpfr_zeta_ui (z, n, (mpfr_rnd_t) rnd); if (mpfr_cmp (t, z)) { printf ("results differ for n=%lu", n); printf (" prec=%u rnd_mode=%s\n", prec, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); printf (" got "); mpfr_dump (z); printf (" expected "); mpfr_dump (t); printf (" approx "); mpfr_dump (y); exit (1); } } } } clear_and_exit: mpfr_clear (x); mpfr_clear (y); mpfr_clear (z); mpfr_clear (t); tests_end_mpfr (); #endif return 0; }
int main (int argc, char *argv[]) { unsigned int prec, yprec; int rnd; mpfr_t x, y, z, t; unsigned long n; int inex; mpfr_exp_t emin, emax; mpfr_flags_t flags, ex_flags; int i; tests_start_mpfr (); emin = mpfr_get_emin (); emax = mpfr_get_emax (); mpfr_init (x); mpfr_init (y); mpfr_init (z); mpfr_init (t); if (argc >= 3) /* tzeta_ui n prec [rnd] */ { mpfr_set_prec (x, atoi (argv[2])); mpfr_zeta_ui (x, atoi (argv[1]), argc > 3 ? (mpfr_rnd_t) atoi (argv[3]) : MPFR_RNDN); mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); printf ("\n"); goto clear_and_exit; } mpfr_set_prec (x, 33); mpfr_set_prec (y, 33); mpfr_zeta_ui (x, 3, MPFR_RNDZ); mpfr_set_str_binary (y, "0.100110011101110100000000001001111E1"); if (mpfr_cmp (x, y)) { printf ("Error for zeta(3), prec=33, MPFR_RNDZ\n"); printf ("expected "); mpfr_dump (y); printf ("got "); mpfr_dump (x); exit (1); } mpfr_clear_flags (); inex = mpfr_zeta_ui (x, 0, MPFR_RNDN); flags = __gmpfr_flags; MPFR_ASSERTN (inex == 0 && mpfr_cmp_si_2exp (x, -1, -1) == 0 && flags == 0); for (i = -2; i <= 2; i += 2) RND_LOOP (rnd) { int ex_inex; set_emin (i); set_emax (i); mpfr_clear_flags (); inex = mpfr_zeta_ui (x, 0, (mpfr_rnd_t) rnd); flags = __gmpfr_flags; if (i < 0) { mpfr_set_inf (y, -1); if (rnd == MPFR_RNDU || rnd == MPFR_RNDZ) { mpfr_nextabove (y); ex_inex = 1; } else { ex_inex = -1; } ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT; } else if (i > 0) { mpfr_set_zero (y, -1); if (rnd == MPFR_RNDD || rnd == MPFR_RNDA) { mpfr_nextbelow (y); ex_inex = -1; } else { ex_inex = 1; } ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT; } else { mpfr_set_str_binary (y, "-1e-1"); ex_inex = 0; ex_flags = 0; } set_emin (emin); set_emax (emax); if (! (mpfr_equal_p (x, y) && MPFR_IS_NEG (x) && SAME_SIGN (inex, ex_inex) && flags == ex_flags)) { printf ("Failure for zeta(0) in %s, exponent range [%d,%d]\n", mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), i, i); printf ("Expected "); mpfr_dump (y); printf (" with inex ~ %d, flags =", ex_inex); flags_out (ex_flags); printf ("Got "); mpfr_dump (x); printf (" with inex = %d, flags =", inex); flags_out (flags); exit (1); } } mpfr_clear_divby0 (); inex = mpfr_zeta_ui (x, 1, MPFR_RNDN); MPFR_ASSERTN (inex == 0 && MPFR_IS_INF (x) && MPFR_IS_POS (x) && mpfr_divby0_p ()); for (prec = MPFR_PREC_MIN; prec <= 100; prec++) { mpfr_set_prec (x, prec); mpfr_set_prec (z, prec); mpfr_set_prec (t, prec); yprec = prec + 10; mpfr_set_prec (y, yprec); for (n = 0; n < 50; n++) RND_LOOP (rnd) { mpfr_zeta_ui (y, n, MPFR_RNDN); if (mpfr_can_round (y, yprec, MPFR_RNDN, MPFR_RNDZ, prec + (rnd == MPFR_RNDN))) { mpfr_set (t, y, (mpfr_rnd_t) rnd); for (i = 0; i <= 1; i++) { if (i) { mpfr_exp_t e; if (MPFR_IS_SINGULAR (t)) break; e = mpfr_get_exp (t); set_emin (e); set_emax (e); } mpfr_zeta_ui (z, n, (mpfr_rnd_t) rnd); if (i) { set_emin (emin); set_emax (emax); } if (mpfr_cmp (t, z)) { printf ("results differ for n = %lu, prec = %u," " %s%s\n", n, prec, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), i ? ", reduced exponent range" : ""); printf (" got "); mpfr_dump (z); printf (" expected "); mpfr_dump (t); printf (" approx "); mpfr_dump (y); exit (1); } } } } } clear_and_exit: mpfr_clear (x); mpfr_clear (y); mpfr_clear (z); mpfr_clear (t); tests_end_mpfr (); return 0; }