static void check_nans (void) { mpfr_t x, xi, xf; mpfr_init2 (x, 123); mpfr_init2 (xi, 123); mpfr_init2 (xf, 123); /* nan */ mpfr_set_nan (x); mpfr_modf (xi, xf, x, MPFR_RNDN); MPFR_ASSERTN (mpfr_nan_p (xi)); MPFR_ASSERTN (mpfr_nan_p (xf)); /* +inf */ mpfr_set_inf (x, 1); mpfr_modf (xi, xf, x, MPFR_RNDN); MPFR_ASSERTN (mpfr_inf_p (xi)); MPFR_ASSERTN (mpfr_sgn (xi) > 0); MPFR_ASSERTN (mpfr_zero_p (xf)); /* -inf */ mpfr_set_inf (x, -1); mpfr_modf (xi ,xf, x, MPFR_RNDN); MPFR_ASSERTN (mpfr_inf_p (xi)); MPFR_ASSERTN (mpfr_sgn (xi) < 0); MPFR_ASSERTN (mpfr_zero_p (xf)); mpfr_clear (x); mpfr_clear (xi); mpfr_clear (xf); }
static PyObject * GMPy_Real_Modf(PyObject *x, CTXT_Object *context) { MPFR_Object *s, *c, *tempx; PyObject *result; int code; CHECK_CONTEXT(context); tempx = GMPy_MPFR_From_Real(x, 1, context); s = GMPy_MPFR_New(0, context); c = GMPy_MPFR_New(0, context); result = PyTuple_New(2); if (! tempx || !s || !c || !result) { Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)s); Py_XDECREF((PyObject*)c); Py_XDECREF(result); return NULL; } mpfr_clear_flags(); code = mpfr_modf(s->f, c->f, tempx->f, GET_MPFR_ROUND(context)); Py_DECREF((PyObject*)tempx); s->rc = code & 0x03; c->rc = code >> 2; if (s->rc == 2) s->rc = -1; if (c->rc == 2) c->rc = -1; _GMPy_MPFR_Cleanup(&s, context); _GMPy_MPFR_Cleanup(&c, context); if (!s || !c) { Py_XDECREF((PyObject*)s); Py_XDECREF((PyObject*)c); Py_DECREF(result); return NULL; } PyTuple_SET_ITEM(result, 0, (PyObject*)s); PyTuple_SET_ITEM(result, 1, (PyObject*)c); return result; }
static void check (const char *xis, const char *xfs, const char *xs, mpfr_prec_t xip, mpfr_prec_t xfp, mpfr_prec_t xp, int expected_return, mpfr_rnd_t rnd_mode) { int inexact; mpfr_t xi, xf, x; mpfr_init2 (xi, xip); mpfr_init2 (xf, xfp); mpfr_init2 (x, xp); mpfr_set_str1 (x, xs); inexact = mpfr_modf (xi, xf, x, rnd_mode); if (mpfr_cmp_str1 (xi, xis)) { printf ("mpfr_modf failed for x=%s, rnd=%s\n", xs, mpfr_print_rnd_mode(rnd_mode)); printf ("got integer value: "); mpfr_out_str (stdout, 10, 0, xi, MPFR_RNDN); printf ("\nexpected %s\n", xis); exit (1); } if (mpfr_cmp_str1 (xf, xfs)) { printf ("mpfr_modf failed for x=%s, rnd=%s\n", xs, mpfr_print_rnd_mode(rnd_mode)); printf ("got fractional value: "); mpfr_out_str (stdout, 10, 0, xf, MPFR_RNDN); printf ("\nexpected %s\n", xfs); exit (1); } if (inexact != expected_return) { printf ("mpfr_modf failed for x=%s, rnd=%s\n", xs, mpfr_print_rnd_mode(rnd_mode)); printf ("got return value: %d, expected %d\n", inexact, expected_return); exit (1); } mpfr_clears (xi, xf, x, (mpfr_ptr) 0); }
static void check_special_exprange (void) { int inexact, ov; unsigned int eflags, gflags; mpfr_t xi, xf, x; mpfr_exp_t emax; emax = mpfr_get_emax (); mpfr_init2 (xi, 7); mpfr_init2 (xf, 7); mpfr_init2 (x, 8); mpfr_set_str (x, "0.11111111", 2, MPFR_RNDN); for (ov = 0; ov <= 1; ov++) { const char *s = ov ? "@Inf@" : "1"; if (ov) set_emax (0); mpfr_clear_flags (); inexact = mpfr_modf (xi, xf, x, MPFR_RNDN); gflags = __gmpfr_flags; set_emax (emax); if (MPFR_NOTZERO (xi) || MPFR_IS_NEG (xi) || mpfr_cmp_str1 (xf, s) != 0) { printf ("Error in check_special_exprange (ov = %d):" " expected 0 and %s, got\n", ov, s); mpfr_out_str (stdout, 2, 0, xi, MPFR_RNDN); printf (" and "); mpfr_out_str (stdout, 2, 0, xf, MPFR_RNDN); printf ("\n"); exit (1); } if (inexact != 4) { printf ("Bad inexact value in check_special_exprange (ov = %d):" " expected 4, got %d\n", ov, inexact); exit (1); } eflags = MPFR_FLAGS_INEXACT | (ov ? MPFR_FLAGS_OVERFLOW : 0); if (gflags != eflags) { printf ("Bad flags in check_special_exprange (ov = %d):" " expected %u, got %u\n", ov, eflags, gflags); exit (1); } } /* Test if an overflow occurs in mpfr_set for ope >= opq. */ mpfr_set_emax (MPFR_EMAX_MAX); mpfr_set_inf (x, 1); mpfr_nextbelow (x); mpfr_clear_flags (); inexact = mpfr_modf (xi, xf, x, MPFR_RNDN); gflags = __gmpfr_flags; if (mpfr_cmp_str1 (xi, "@Inf@") != 0 || MPFR_NOTZERO (xf) || MPFR_IS_NEG (xf)) { printf ("Error in check_special_exprange:" " expected 0 and @Inf@, got\n"); mpfr_out_str (stdout, 2, 0, xi, MPFR_RNDN); printf (" and "); mpfr_out_str (stdout, 2, 0, xf, MPFR_RNDN); printf ("\n"); exit (1); } if (inexact != 1) { printf ("Bad inexact value in check_special_exprange:" " expected 1, got %d\n", inexact); exit (1); } eflags = MPFR_FLAGS_INEXACT | MPFR_FLAGS_OVERFLOW; if (gflags != eflags) { printf ("Bad flags in check_special_exprange:" " expected %u, got %u\n", eflags, gflags); exit (1); } set_emax (emax); /* Test if an underflow occurs in the general case. TODO */ mpfr_clears (xi, xf, x, (mpfr_ptr) 0); }