static PyObject * GMPy_MPZ_Function_NumDigits(PyObject *self, PyObject *args) { long base = 10; Py_ssize_t argc; MPZ_Object *temp; PyObject *result; argc = PyTuple_GET_SIZE(args); if (argc == 0 || argc > 2) { TYPE_ERROR("num_digits() requires 'mpz',['int'] arguments"); return NULL; } if (argc == 2) { base = PyIntOrLong_AsLong(PyTuple_GET_ITEM(args, 1)); if (base == -1 && PyErr_Occurred()) { return NULL; } } if ((base < 2) || (base > 62)) { VALUE_ERROR("base must be in the interval [2, 62]"); return NULL; } if (!(temp = GMPy_MPZ_From_Integer(PyTuple_GET_ITEM(args, 0), NULL))) { return NULL; } result = PyIntOrLong_FromSize_t(mpz_sizeinbase(temp->z, (int)base)); Py_DECREF((PyObject*)temp); return result; }
static PyObject * GMPy_Real_Round2(PyObject *x, PyObject *y, CTXT_Object *context) { MPFR_Object *result, *tempx; long n = 0; CHECK_CONTEXT(context); if (y) { n = PyIntOrLong_AsLong(y); if ( (n == -1 && PyErr_Occurred()) || n < MPFR_PREC_MIN || n > MPFR_PREC_MAX) { VALUE_ERROR("invalid precision"); return NULL; } } if (!(tempx = GMPy_MPFR_From_Real(x, 1, context))) { return NULL; } if (!(result = GMPy_MPFR_New(mpfr_get_prec(tempx->f), context))) { Py_DECREF((PyObject*)tempx); return NULL; } mpfr_set(result->f, tempx->f, GET_MPFR_ROUND(context)); Py_DECREF((PyObject*)tempx); mpfr_clear_flags(); result->rc = mpfr_prec_round(result->f, n, GET_MPFR_ROUND(context)); _GMPy_MPFR_Cleanup(&result, context); return (PyObject*)result; }
static PyObject * GMPy_MPZ_Method_NumDigits(PyObject *self, PyObject *args) { long base = 10; PyObject *result; if (PyTuple_GET_SIZE(args) == 1) { base = PyIntOrLong_AsLong(PyTuple_GET_ITEM(args, 0)); if (base == -1 && PyErr_Occurred()) { return NULL; } } if ((base < 2) || (base > 62)) { VALUE_ERROR("base must be in the interval [2, 62]"); return NULL; } result = PyIntOrLong_FromSize_t(mpz_sizeinbase(MPZ(self), (int)base)); return result; }