SeedValue seed_mpfr_nexttoward (SeedContext ctx, SeedObject function, SeedObject this_object, gsize argument_count, const SeedValue args[], SeedException *exception) { mpfr_ptr rop, op; CHECK_ARG_COUNT("mpfr.nexttoward", 1); rop = seed_object_get_private(this_object); if ( seed_value_is_object_of_class(ctx, args[0], mpfr_class) ) { op = seed_object_get_private(args[0]); } else { TYPE_EXCEPTION("mpfr.nexttoward", "mpfr_t"); } mpfr_nexttoward(rop, op); return seed_make_null(ctx); }
static PyObject * GMPy_Context_NextToward(PyObject *self, PyObject *args) { MPFR_Object *result, *tempx, *tempy; CTXT_Object *context = NULL; int direction; mpfr_rnd_t temp_round; if (self && CTXT_Check(self)) { context = (CTXT_Object*)self; } else { CHECK_CONTEXT(context); } if (PyTuple_GET_SIZE(args) != 2) { TYPE_ERROR("next_toward() requires 2 arguments"); return NULL; } tempx = GMPy_MPFR_From_Real(PyTuple_GET_ITEM(args, 0), 1, context); tempy = GMPy_MPFR_From_Real(PyTuple_GET_ITEM(args, 1), 1, context); if (!tempx || !tempy) { TYPE_ERROR("next_toward() argument type not supported"); Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)tempy); return NULL; } if (!(result = GMPy_MPFR_New(mpfr_get_prec(tempx->f), context))) { Py_DECREF((PyObject*)tempx); Py_DECREF((PyObject*)tempy); return NULL; } mpfr_clear_flags(); mpfr_set(result->f, tempx->f, GET_MPFR_ROUND(context)); mpfr_nexttoward(result->f, tempy->f); result->rc = 0; direction = mpfr_signbit(tempy->f); Py_DECREF((PyObject*)tempx); Py_DECREF((PyObject*)tempy); temp_round = GET_MPFR_ROUND(context); if (direction) context->ctx.mpfr_round = MPFR_RNDD; else context->ctx.mpfr_round = MPFR_RNDU; _GMPy_MPFR_Cleanup(&result, context); context->ctx.mpfr_round = temp_round; return (PyObject*)result; }