static PyObject * GMPy_Complex_Add(PyObject *x, PyObject *y, CTXT_Object *context) { MPC_Object *result = NULL; CHECK_CONTEXT(context); if (!(result = GMPy_MPC_New(0, 0, context))) { /* LCOV_EXCL_START */ return NULL; /* LCOV_EXCL_STOP */ } if (MPC_Check(x) && MPC_Check(y)) { SET_MPC_MPC_WAS_NAN(context, x, y); result->rc = mpc_add(result->c, MPC(x), MPC(y), GET_MPC_ROUND(context)); _GMPy_MPC_Cleanup(&result, context); return (PyObject*)result; } if (IS_COMPLEX(x) && IS_COMPLEX(y)) { MPC_Object *tempx = NULL, *tempy = NULL; if (!(tempx = GMPy_MPC_From_Complex(x, 1, 1, context)) || !(tempy = GMPy_MPC_From_Complex(y, 1, 1, context))) { /* LCOV_EXCL_START */ Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)tempy); Py_DECREF((PyObject*)result); return NULL; /* LCOV_EXCL_STOP */ } SET_MPC_MPC_WAS_NAN(context, tempx, tempy); result->rc = mpc_add(result->c, tempx->c, tempy->c, GET_MPC_ROUND(context)); Py_DECREF((PyObject*)tempx); Py_DECREF((PyObject*)tempy); _GMPy_MPC_Cleanup(&result, context); return (PyObject*)result; } /* LCOV_EXCL_START */ Py_DECREF((PyObject*)result); SYSTEM_ERROR("Internal error in GMPy_Complex_Add()."); return NULL; /* LCOV_EXCL_STOP */ }
static MPC_Object * GMPy_MPC_From_MPC(MPC_Object *obj, mpfr_prec_t rprec, mpfr_prec_t iprec, CTXT_Object *context) { MPC_Object *result = NULL; assert(MPC_Check(obj)); /* Optimize the critical case when prec==1 or obj is NaN or Inf. */ if ((rprec == 1 && iprec == 1) || (!mpfr_number_p(mpc_realref(obj->c)) && !mpfr_number_p(mpc_imagref(obj->c)))) { Py_INCREF((PyObject*)obj); return obj; } CHECK_CONTEXT(context); if (rprec == 0) rprec = GET_REAL_PREC(context); else if (rprec == 1) rprec = mpfr_get_prec(mpc_realref(obj->c)); if (iprec == 0) iprec = GET_IMAG_PREC(context); else if (iprec == 1) iprec = mpfr_get_prec(mpc_imagref(obj->c)); /* Try to identify when an additional reference to existing instance can * be returned. It is possible when (1) the precision matches, (2) the * exponent is valid and not in the range that might require subnormal- * ization, and (3) subnormalize is not enabled. */ if ((rprec == mpfr_get_prec(mpc_realref(obj->c))) && (iprec == mpfr_get_prec(mpc_imagref(obj->c))) && (!context->ctx.subnormalize) && (mpc_realref(obj->c)->_mpfr_exp >= (context->ctx.emin + mpfr_get_prec(mpc_realref(obj->c)) - 1)) && (mpc_realref(obj->c)->_mpfr_exp <= context->ctx.emax) && (mpc_imagref(obj->c)->_mpfr_exp >= (context->ctx.emin + mpfr_get_prec(mpc_imagref(obj->c)) - 1)) && (mpc_imagref(obj->c)->_mpfr_exp <= context->ctx.emax) ) { Py_INCREF((PyObject*)obj); return obj; } if ((result = GMPy_MPC_New(rprec, iprec, context))) { result->rc = mpc_set(result->c, obj->c, GET_MPC_ROUND(context)); _GMPy_MPC_Cleanup(&result, context); } return result; }
static PyObject * _GMPy_MPC_Sin_Cos(PyObject *x, CTXT_Object *context) { MPC_Object *s, *c; PyObject *result; int code; CHECK_CONTEXT(context); s = GMPy_MPC_New(0, 0, context); c = GMPy_MPC_New(0, 0, context); result = PyTuple_New(2); if (!s || !c || !result) { Py_XDECREF((PyObject*)s); Py_XDECREF((PyObject*)c); Py_XDECREF(result); return NULL; } code = mpc_sin_cos(s->c, c->c, MPC(x), GET_MPC_ROUND(context), GET_MPC_ROUND(context)); s->rc = MPC_INEX1(code); c->rc = MPC_INEX2(code); _GMPy_MPC_Cleanup(&s, context); _GMPy_MPC_Cleanup(&c, context); if (!s || !c) { Py_XDECREF((PyObject*)s); Py_XDECREF((PyObject*)c); Py_XDECREF(result); return NULL; } PyTuple_SET_ITEM(result, 0, (PyObject*)s); PyTuple_SET_ITEM(result, 1, (PyObject*)c); return result; }
static PyObject * _GMPy_MPC_Atanh(PyObject *x, CTXT_Object *context) { MPC_Object *result; CHECK_CONTEXT(context); if (!(result = GMPy_MPC_New(0, 0, context))) { return NULL; } result->rc = mpc_atanh(result->c, MPC(x), GET_MPC_ROUND(context)); _GMPy_MPC_Cleanup(&result, context); return (PyObject*)result; }