int main (int argc, char **argv) { mpfr_t x, y; mpq_t a, b; mpfi_t i; mpq_init (a); mpq_init (b); mpfi_init2 (i, 53); mpfr_init2 (x, 53); mpfr_init2 (y, 53); mpq_set_si (a, -1, 3); mpq_set_ui (b, +1, 1024); mpfr_set_q (x, a, MPFI_RNDD); mpfr_set_q (y, b, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, b, a, x, y, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, b, b, y, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfr_set_q (y, a, MPFI_RNDU); check (i, a, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); mpq_clear (a); mpq_clear (b); mpfi_clear (i); mpfr_clear (x); mpfr_clear (y); return 0; }
int main(void) { sollya_obj_t a; mpfi_t res; int s; mpfi_init2(res, 100); sollya_lib_init(); sollya_lib_install_msg_callback(callback, NULL); a = SOLLYA_CONST(4); s = sollya_lib_get_interval_from_range(res, a); if (s==0) sollya_lib_printf("%b is not a range\n\n", a); else sollya_lib_printf("%b has been converted to %w.\n\n", a, res); sollya_lib_clear_obj(a); /* Exact conversion */ a = sollya_lib_parse_string("[1, 3]"); s = sollya_lib_get_interval_from_range(res, a); if (s==0) sollya_lib_printf("%b is not a range\n\n", a); else sollya_lib_printf("%b has been converted to %w.\n\n", a, res); sollya_lib_clear_obj(a); /* Another exact conversion */ a = SOLLYA_CONST(100); sollya_lib_set_prec_and_print(a); sollya_lib_clear_obj(a); a = sollya_lib_powers(); sollya_lib_set_display(a); sollya_lib_clear_obj(a); a = sollya_lib_parse_string("[exp(1), pi]"); s = sollya_lib_get_interval_from_range(res, a); if (s==0) sollya_lib_printf("%b is not a range\n\n", a); else sollya_lib_printf("%b has been converted to\n%w (should be [430728948929449700355022696705 * 2^(-97), 995610453248924340922087778489 * 2^(-98)]).\n\n", a, res); sollya_lib_clear_obj(a); /* Inexact conversion */ a = SOLLYA_CONST(165); sollya_lib_set_prec_and_print(a); sollya_lib_clear_obj(a); a = sollya_lib_decimal(); sollya_lib_set_display(a); sollya_lib_clear_obj(a); a = sollya_lib_parse_string("[exp(1), pi]"); s = sollya_lib_get_interval_from_range(res, a); if (s==0) sollya_lib_printf("%b is not a range\n\n", a); else sollya_lib_printf("%b has been converted to\n%w (the first one should be enclosed in the second one).\n\n", a, res); sollya_lib_clear_obj(a); mpfi_clear(res); sollya_lib_close(); return 0; }
static void check_overflow () { mpfr_t max; mpfi_t a; mpfr_t b; int inexact; mpfi_init2 (a, 53); mpfr_init2 (max, 53); mpfr_init2 (b, 53); mpfr_set_ui (&(a->left), 1, MPFI_RNDD); mpfr_set_inf (max, +1); mpfr_nextbelow (max); mpfr_set (&(a->right), max, MPFI_RNDU); mpfr_set_ui (b, +1, MPFI_RNDD); inexact = mpfi_add_fr (a, a, b); if (!mpfr_inf_p (&(a->right))) { printf ("Error: mpfi_add_fr does not correctly handle positive " "overflow.\n"); exit (1); } if (!MPFI_RIGHT_IS_INEXACT (inexact)) { printf ("Error: mpfi_add_fr does not return correct value when positive " "overflow.\n"); exit (1); } mpfr_set_inf (max, -1); mpfr_nextabove (max); mpfr_set (&(a->left), max, MPFI_RNDD); mpfr_set_ui (&(a->right), 1, MPFI_RNDU); mpfr_set_si (b, -1, MPFI_RNDD); inexact = mpfi_add_fr (a, a, b); if (!mpfr_inf_p (&(a->left))) { printf ("Error: mpfi_add_fr does not correctly handle negative " "overflow.\n"); exit (1); } if (!MPFI_LEFT_IS_INEXACT (inexact)) { printf ("Error: mpfi_add_fr does not return correct value when negative " "overflow.\n"); exit (1); } mpfi_clear (a); mpfr_clear (b); mpfr_clear (max); }
void check () { mpfi_t interval; long a, b, c; int cmp; int i; i = 1; a = LONG_MAX; while (a >>= 1) i++; mpfi_init2 (interval, i); for (i = 0; i <= 1000; ++i) { /* random numbers a < b < c */ a = random_si (); b = random_si (); c = random_si (); ORDER (a, b); ORDER (a, c); ORDER (b, c); mpfi_interv_si (interval, b, c); cmp = mpfi_cmp_si (interval, a); if (cmp < 0 || (cmp == 0 && a != b)) { print_error (a, interval); } mpfr_set_nan (&(interval->right)); if (mpfi_cmp_si (interval, a) != 1) { print_error (a, interval); } mpfi_interv_si (interval, a, c); if (mpfi_cmp_si (interval, b) != 0) { print_error (b, interval); } mpfr_set_nan (&(interval->right)); if (mpfi_cmp_si (interval, b) != 1) { print_error (b, interval); } mpfi_interv_si (interval, a, b); cmp = mpfi_cmp_si (interval, c); if (cmp > 0 || (cmp == 0 && c != b)) { print_error (c, interval); } mpfr_set_nan (&(interval->right)); if (mpfi_cmp_si (interval, c) != 1) { print_error (c, interval); } } mpfi_clear (interval); }
int main (int argc, char **argv) { mpfr_t x, y; long a, b; mpfi_t i; mpfi_init2 (i, 53); mpfr_init2 (x, 53); mpfr_init2 (y, 53); a = 0; b = 42; mpfr_set_ui (x, a, MPFI_RNDD); mpfr_set_ui (y, b, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, b, y, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfr_neg (y, x, MPFI_RNDD); check (i, a, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); a = +1; b = +123456; mpfr_set_si (x, a, MPFI_RNDD); mpfr_set_si (y, b, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); a = -1920; b = -17; mpfr_set_si (x, a, MPFI_RNDD); mpfr_set_si (y, b, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfi_set_prec (i, 4); mpfr_set_prec (x, 4); mpfr_set_prec (y, 4); mpfr_set_si (x, a, MPFI_RNDD); mpfr_set_si (y, b, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, b, a, x, y, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfr_set_si (x, b, MPFI_RNDD); check (i, b, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); mpfi_clear (i); mpfr_clear (x); mpfr_clear (y); return 0; }
int main (int argc, char **argv) { FILE *stream; mpfi_t interval; mpfi_t left; mpfi_t right; mpfi_t expected_left; mpfi_t expected_right; int retval; mpfi_init2 (interval, 1024); mpfi_init2 (left, 1024); mpfi_init2 (right, 1024); mpfi_init2 (expected_left, 1024); mpfi_init2 (expected_right, 1024); stream = open_file ("bisect.dat"); init_reading (stream); while (nextchar != EOF) { test_line_number = line_number; read_sign (stream, &retval); read_mpfi (stream, expected_left); mpfi_set_prec (left, mpfi_get_prec (expected_left)); read_mpfi (stream, expected_right); mpfi_set_prec (right, mpfi_get_prec (expected_right)); read_mpfi (stream, interval); check (left, right, interval, expected_left, expected_right, retval); } close_file (stream); mpfi_clear (interval); mpfi_clear (left); mpfi_clear (right); mpfi_clear (expected_left); mpfi_clear (expected_right); return 0; }
int mpfi_is_inside_z (mpz_srcptr a, mpfi_srcptr b) { int res; mpfi_t tmp; mpfi_init2 (tmp, mpfi_get_prec (b)); mpfi_set_z (tmp, a); res = mpfi_is_inside (tmp, b); MPFI_CLEAR (tmp); return res; }
int mpfi_is_inside_d (const double a, mpfi_srcptr b) { int res; mpfi_t tmp; mpfi_init2 (tmp, mpfi_get_prec (b)); mpfi_set_d (tmp, a); res = mpfi_is_inside (tmp, b); MPFI_CLEAR (tmp); return res; }
void check_overflow () { mpfr_t max; mpfi_t a; mpq_t q; int inexact; mpq_init (q); mpfi_init2 (a, 53); mpfr_init2 (max, 53); mpq_set_ui (q, 42, 17); mpfr_set_ui (&(a->left), 1, MPFI_RNDD); mpfr_set_inf (max, +1); mpfr_nextbelow (max); mpfr_set (&(a->right), max, MPFI_RNDU); inexact = mpfi_add_q (a, a, q); if (!mpfr_inf_p (&(a->right))) { printf ("Error: mpfi_add_q does not correctly handle overflow.\n"); exit (1); } if (!MPFI_RIGHT_IS_INEXACT (inexact)) { printf ("Error: mpfi_add_q does not return correct value " "when overflow.\n"); exit (1); } mpfr_set_inf (max, -1); mpfr_nextabove (max); mpfr_set (&(a->left), max, MPFI_RNDD); mpfr_set_ui (&(a->right), 1, MPFI_RNDU); mpq_set_si (q, -42, 17); inexact = mpfi_add_q (a, a, q); if (!mpfr_inf_p (&(a->left))) { printf ("Error: mpfi_add_q does not correctly handle negative " "overflow.\n"); exit (1); } if (!MPFI_LEFT_IS_INEXACT (inexact)) { printf ("Error: mpfi_add_q does not return correct value when negative " "overflow.\n"); exit (1); } mpfi_clear (a); mpfr_clear (max); mpq_clear (q); }
int mpfi_is_inside_q (mpq_srcptr a, mpfi_srcptr b) { int res; mpfi_t tmp; /* Returns 0 if one of the operands is a NaN */ if (MPFI_NAN_P (b)) return 0; mpfi_init2 (tmp, mpfi_get_prec (b)); mpfi_set_q (tmp, a); res = mpfi_is_inside (tmp, b); MPFI_CLEAR (tmp); return res; }
int mpfi_div_fr (mpfi_ptr a, mpfi_srcptr b, mpfr_srcptr c) { mpfi_t tmp; int inexact; mpfi_init2 (tmp, mpfr_get_prec (c)); mpfi_set_fr (tmp, c); /* exact */ inexact = mpfi_div (a, b, tmp); MPFI_CLEAR (tmp); if (MPFI_NAN_P (a)) MPFR_RET_NAN; return inexact; }
int main (int argc, char **argv) { mpfr_t minf, pinf; mpfr_t mzero, pzero; mpfr_t nan; mpfr_t x, y; mpfr_t xx, yy; mpfi_t i; mpfi_init2 (i, 53); mpfr_init2 (x, 53); mpfr_init2 (y, 53); mpfr_init2 (xx, 53); mpfr_init2 (yy, 53); mpfr_init2 (minf, 53); mpfr_init2 (pinf, 53); mpfr_init2 (mzero, 53); mpfr_init2 (pzero, 53); mpfr_init2 (nan, 53); mpfr_set_nan (nan); mpfr_set_inf (minf, -1); mpfr_set_inf (pinf, +1); mpfr_set_ui (pzero, 0, MPFI_RNDU); mpfr_neg (mzero, pzero, MPFI_RNDD); /* special values */ check (i, minf, minf, minf, minf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, minf, mzero, minf, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, minf, minf, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, minf, pzero, minf, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, minf, minf, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, minf, pinf, minf, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, minf, minf, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, minf, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, minf, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, mzero, pzero, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, pzero, pzero, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, mzero, pzero, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, pinf, pzero, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, mzero, pzero, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, mzero, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, pzero, pzero, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, pzero, pzero, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, pinf, pzero, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, pzero, pzero, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, pzero, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, pinf, pinf, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, pinf, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); /* regular values */ mpfr_set_si (x, -456789, MPFI_RNDD); mpfr_set_si (y, 123456, MPFI_RNDU); check (i, x, y, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, x, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, x, minf, minf, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, minf, x, minf, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, x, mzero, x, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, x, x, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, mzero, pzero, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, mzero, y, pzero, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, x, pzero, x, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, x, x, mzero, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, pzero, pzero, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pzero, y, pzero, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, x, pinf, x, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, x, x, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, pinf, y, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, pinf, y, y, pinf, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, x, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, x, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, x, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfr_set_si (x, -400009, MPFI_RNDD); mpfr_set_si (y, 100007, MPFI_RNDU); mpfi_set_prec (i, 12); mpfr_set_prec (xx, 12); mpfr_set_prec (yy, 12); mpfr_set (xx, x, MPFI_RNDD); mpfr_set (yy, y, MPFI_RNDU); check (i, x, y, xx, yy, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); check (i, y, x, xx, yy, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); mpfr_set (xx, x, MPFI_RNDU); check (i, x, minf, minf, xx, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, minf, x, minf, xx, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, y, minf, minf, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, minf, y, minf, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); mpfr_set (xx, x, MPFI_RNDD); check (i, x, mzero, xx, mzero, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, mzero, x, xx, mzero, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, y, mzero, pzero, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, mzero, y, pzero, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, x, pzero, xx, mzero, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, pzero, x, xx, mzero, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, y, pzero, pzero, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, pzero, y, pzero, yy, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, x, pinf, xx, pinf, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, pinf, x, xx, pinf, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); mpfr_set (yy, y, MPFI_RNDD); check (i, y, pinf, yy, pinf, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, pinf, y, yy, pinf, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, x, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, x, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, y, nan, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, nan, y, nan, nan, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfi_clear (i); mpfr_clear (x); mpfr_clear (y); mpfr_clear (xx); mpfr_clear (yy); mpfr_clear (minf); mpfr_clear (pinf); mpfr_clear (mzero); mpfr_clear (pzero); mpfr_clear (nan); return 0; }
int main (int argc, char **argv) { mpfr_t x, y; double a, b; mpfi_t i; mpfi_init2 (i, 53); mpfr_init2 (x, 53); mpfr_init2 (y, 53); a = -1; b = +1; mpfr_set_d (x, -1, MPFI_RNDD); mpfr_set_d (y, +1, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfi_set_prec (i, 4); mpfr_set_prec (x, 4); mpfr_set_prec (y, 4); a = -1; b = +40; mpfr_set_d (x, -1, MPFI_RNDD); mpfr_set_d (y, +40, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); a = -1; b = +42.35; mpfr_set_d (x, -1, MPFI_RNDD); mpfr_set_d (y, +42.35, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); check (i, b, a, x, y, MPFI_FLAGS_RIGHT_ENDPOINT_INEXACT); a = -0.1; mpfr_set_d (x, -0.1, MPFI_RNDD); mpfr_set_d (y, +42.35, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_INEXACT); a = -1e-4; b = +16; mpfr_set_d (x, -1e-4, MPFI_RNDD); mpfr_set_d (y, +16, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); check (i, b, a, x, y, MPFI_FLAGS_LEFT_ENDPOINT_INEXACT); mpfr_set_nan (x); a = mpfr_get_d (x, MPFI_RNDD); /* a = NaN, if supported */ check (i, a, b, y, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, a, a, x, x, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfr_set_ui (x, 0, MPFI_RNDD); mpfr_neg (x, x, MPFI_RNDD); a = mpfr_get_d (x, MPFI_RNDD); /* a = -0, if supported */ mpfr_neg (x, x, MPFI_RNDU); check (i, a, b, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); check (i, b, a, x, y, MPFI_FLAGS_BOTH_ENDPOINTS_EXACT); mpfi_clear (i); mpfr_clear (x); mpfr_clear (y); return 0; }