static void teq (mpfr_t x) { mpfr_t y; unsigned long k, px, mx; mpfr_init2 (y, MPFR_PREC(x)); mx = (MPFR_PREC(x) - 1) / mp_bits_per_limb; px = mp_bits_per_limb - 2; for (k = 2; k < MPFR_PREC(x); k++) { mpfr_set (y, x, MPFR_RNDN); MPFR_MANT(y) [mx] ^= (mp_limb_t) 1 << px; if (mpfr_eq(y, x, k) || !mpfr_eq(y, x, k - 1)) { printf ("Error in eq.\n"); printf ("x = "); mpfr_print_binary (x); printf ("\n"); printf ("y = "); mpfr_print_binary (y); printf ("\n"); printf ("k = %lu\n", k); printf ("mpfr_eq(y, x, k) = %d\nmpfr_eq(y, x, k - 1) = %d\n", mpfr_eq (y, x, k), mpfr_eq (y, x, k - 1)); exit (1); } if (px) { --px; } else { --mx; px = mp_bits_per_limb - 1; } } mpfr_clear (y); }
int main (void) { int j, k; mpfr_t x, y, z, t, y2, z2, t2; tests_start_mpfr (); mpfr_inits2 (SIZEX, x, y, z, t, y2, z2, t2, (mpfr_ptr) 0); mpfr_set_str1 (x, "0.5"); mpfr_ceil(y, x); if (mpfr_cmp_ui (y, 1)) { printf ("Error in mpfr_ceil for x=0.5: expected 1.0, got "); mpfr_print_binary(y); putchar('\n'); exit (1); } mpfr_set_ui (x, 0, MPFR_RNDN); mpfr_ceil(y, x); if (mpfr_cmp_ui(y,0)) { printf ("Error in mpfr_ceil for x=0.0: expected 0.0, got "); mpfr_print_binary(y); putchar('\n'); exit (1); } mpfr_set_ui (x, 1, MPFR_RNDN); mpfr_ceil(y, x); if (mpfr_cmp_ui(y,1)) { printf ("Error in mpfr_ceil for x=1.0: expected 1.0, got "); mpfr_print_binary(y); putchar('\n'); exit (1); } for (j=0;j<1000;j++) { mpfr_urandomb (x, RANDS); MPFR_EXP (x) = 2; for (k = 2; k <= SIZEX; k++) { mpfr_set_prec(y, k); mpfr_set_prec(y2, k); mpfr_set_prec(z, k); mpfr_set_prec(z2, k); mpfr_set_prec(t, k); mpfr_set_prec(t2, k); mpfr_floor(y, x); mpfr_set(y2, x, MPFR_RNDD); mpfr_trunc(z, x); mpfr_set(z2, x, MPFR_RNDZ); mpfr_ceil(t, x); mpfr_set(t2, x, MPFR_RNDU); if (!mpfr_eq(y, y2, k)) { printf("Error in floor, x = "); mpfr_print_binary(x); printf("\n"); printf("floor(x) = "); mpfr_print_binary(y); printf("\n"); printf("round(x, RNDD) = "); mpfr_print_binary(y2); printf("\n"); exit(1); } if (!mpfr_eq(z, z2, k)) { printf("Error in trunc, x = "); mpfr_print_binary(x); printf("\n"); printf("trunc(x) = "); mpfr_print_binary(z); printf("\n"); printf("round(x, RNDZ) = "); mpfr_print_binary(z2); printf("\n"); exit(1); } if (!mpfr_eq(y, y2, k)) { printf("Error in ceil, x = "); mpfr_print_binary(x); printf("\n"); printf("ceil(x) = "); mpfr_print_binary(t); printf("\n"); printf("round(x, RNDU) = "); mpfr_print_binary(t2); printf("\n"); exit(1); } MPFR_EXP(x)++; } } mpfr_clears (x, y, z, t, y2, z2, t2, (mpfr_ptr) 0); tests_end_mpfr (); return 0; }
static void special (void) { mpfr_t x, y, z; int i, error = 0; mpfr_init2 (x, 53); mpfr_init2 (y, 53); mpfr_init2 (z, 53); mpfr_set_str (x, "1", 10, (mpfr_rnd_t) 0); mpfr_set_str (y, "1e-10000", 10, (mpfr_rnd_t) 0); mpfr_add (z, x, y, MPFR_RNDU); for (i = 1; i <= 52; i++) if (mpfr_eq (x, z, i) == 0) error = 1; for (i = 53; i <= 100; i++) if (mpfr_eq (x, z, i) != 0) error = 1; if (mpfr_eq (x, z, 1000) != 0) error = 1; if (error) { printf ("Error in mpfr_eq (1, 1+1e-1000)\n"); exit (1); } mpfr_set_nan (x); mpfr_set_nan (y); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_inf (y, 1); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_ui (y, 0, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_inf (x, 1); mpfr_set_inf (y, 1); MPFR_ASSERTN(mpfr_eq (x, y, 1)); mpfr_set_inf (x, 1); mpfr_set_inf (y, -1); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_inf (x, -1); mpfr_set_inf (y, -1); MPFR_ASSERTN(mpfr_eq (x, y, 1)); mpfr_set_inf (x, 1); mpfr_set_ui (y, 0, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_ui (x, 1, MPFR_RNDN); mpfr_set_ui (y, 0, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); MPFR_ASSERTN(mpfr_eq (y, x, 1) == 0); mpfr_set_ui (x, 0, MPFR_RNDN); mpfr_set_ui (y, 0, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1)); mpfr_neg (y, y, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1)); mpfr_neg (x, x, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1)); mpfr_set_ui (x, 1, MPFR_RNDN); mpfr_neg (y, x, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_prec (x, 2 * mp_bits_per_limb); mpfr_set_prec (y, mp_bits_per_limb); mpfr_set_ui (x, 1, MPFR_RNDN); mpfr_set_ui (y, 1, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb)); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb + 1)); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb)); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb + 1)); mpfr_nextabove (x); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb)); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb + 1)); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb) == 0); MPFR_ASSERTN(mpfr_eq (x, y, 2 * mp_bits_per_limb + 1) == 0); MPFR_ASSERTN(mpfr_eq (y, x, mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (y, x, mp_bits_per_limb)); MPFR_ASSERTN(mpfr_eq (y, x, mp_bits_per_limb + 1)); MPFR_ASSERTN(mpfr_eq (y, x, 2 * mp_bits_per_limb - 1)); MPFR_ASSERTN(mpfr_eq (y, x, 2 * mp_bits_per_limb) == 0); MPFR_ASSERTN(mpfr_eq (y, x, 2 * mp_bits_per_limb + 1) == 0); mpfr_set_ui (x, 1, MPFR_RNDN); mpfr_set_ui (y, 2, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1) == 0); mpfr_set_prec (x, 2 * mp_bits_per_limb); mpfr_set_prec (y, 2 * mp_bits_per_limb); mpfr_set_ui (x, 2, MPFR_RNDN); mpfr_set_ui (y, 3, MPFR_RNDN); MPFR_ASSERTN(mpfr_eq (x, y, 1)); MPFR_ASSERTN(mpfr_eq (x, y, 2) == 0); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb) == 0); MPFR_ASSERTN(mpfr_eq (x, y, mp_bits_per_limb + 1) == 0); mpfr_clear (x); mpfr_clear (y); mpfr_clear (z); }