You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.6 KiB
133 lines
4.6 KiB
diff --git a/src/gmpy2_mpz.c b/src/gmpy2_mpz.c
|
|
index e5087fa..66a297a 100644
|
|
--- a/src/gmpy2_mpz.c
|
|
+++ b/src/gmpy2_mpz.c
|
|
@@ -69,7 +69,7 @@ static PyNumberMethods GMPy_MPZ_number_methods =
|
|
(binaryfunc) GMPy_MPZ_ISub_Slot, /* nb_inplace_subtract */
|
|
(binaryfunc) GMPy_MPZ_IMul_Slot, /* nb_inplace_multiply */
|
|
(binaryfunc) GMPy_MPZ_IRem_Slot, /* nb_inplace_remainder */
|
|
- (ternaryfunc) GMPy_MPZ_IPow_Slot, /* nb_inplace_power */
|
|
+ 0, /* nb_inplace_power */
|
|
(binaryfunc) GMPy_MPZ_ILshift_Slot, /* nb_inplace_lshift */
|
|
(binaryfunc) GMPy_MPZ_IRshift_Slot, /* nb_inplace_rshift */
|
|
0, /* nb_inplace_and */
|
|
@@ -113,7 +113,7 @@ static PyNumberMethods GMPy_MPZ_number_methods =
|
|
(binaryfunc) GMPy_MPZ_IMul_Slot, /* nb_inplace_multiply */
|
|
0, /* nb_inplace_divide */
|
|
(binaryfunc) GMPy_MPZ_IRem_Slot, /* nb_inplace_remainder */
|
|
- (ternaryfunc) GMPy_MPZ_IPow_Slot, /* nb_inplace_power */
|
|
+ 0, /* nb_inplace_power */
|
|
(binaryfunc) GMPy_MPZ_ILshift_Slot, /* nb_inplace_lshift */
|
|
(binaryfunc) GMPy_MPZ_IRshift_Slot, /* nb_inplace_rshift */
|
|
0, /* nb_inplace_and */
|
|
@@ -229,4 +229,3 @@ static PyTypeObject MPZ_Type =
|
|
GMPy_MPZ_NewInit, /* tp_new */
|
|
0, /* tp_free */
|
|
};
|
|
-
|
|
diff --git a/src/gmpy2_pow.c b/src/gmpy2_pow.c
|
|
index ddcb43a..cf96470 100644
|
|
--- a/src/gmpy2_pow.c
|
|
+++ b/src/gmpy2_pow.c
|
|
@@ -98,8 +98,11 @@ GMPy_Integer_Pow(PyObject *b, PyObject *e, PyObject *m, CTXT_Object *context)
|
|
unsigned long el;
|
|
|
|
if (mpz_sgn(tempe->z) < 0) {
|
|
- VALUE_ERROR("pow() exponent cannot be negative");
|
|
- goto err;
|
|
+ Py_DECREF((PyObject*)result);
|
|
+ Py_DECREF((PyObject*)tempb);
|
|
+ Py_DECREF((PyObject*)tempe);
|
|
+
|
|
+ return GMPy_Real_Pow(b, e, m, context);
|
|
}
|
|
|
|
/* Catch -1, 0, 1 getting raised to large exponents. */
|
|
diff --git a/src/gmpy2_xmpz_inplace.c b/src/gmpy2_xmpz_inplace.c
|
|
index bbcd977..e5bbf09 100644
|
|
--- a/src/gmpy2_xmpz_inplace.c
|
|
+++ b/src/gmpy2_xmpz_inplace.c
|
|
@@ -271,14 +271,14 @@ GMPy_XMPZ_IPow_Slot(PyObject *self, PyObject *other, PyObject *mod)
|
|
mp_bitcnt_t exp;
|
|
|
|
exp = mp_bitcnt_t_From_Integer(other);
|
|
- if (exp == (mp_bitcnt_t)(-1) && PyErr_Occurred()) {
|
|
- PyErr_Clear();
|
|
- Py_RETURN_NOTIMPLEMENTED;
|
|
- }
|
|
+ if (exp == (mp_bitcnt_t)(-1) && PyErr_Occurred())
|
|
+ return NULL;
|
|
|
|
mpz_pow_ui(MPZ(self), MPZ(self), exp);
|
|
Py_INCREF((PyObject*)self);
|
|
return (PyObject*)self;
|
|
+
|
|
+ Py_RETURN_NOTIMPLEMENTED;
|
|
}
|
|
|
|
/* Inplace xmpz and.
|
|
@@ -346,4 +346,3 @@ GMPy_XMPZ_IIor_Slot(PyObject *self, PyObject *other)
|
|
|
|
Py_RETURN_NOTIMPLEMENTED;
|
|
}
|
|
-
|
|
diff --git a/test/test_gmpy2_mpz_inplace.txt b/test/test_gmpy2_mpz_inplace.txt
|
|
index e7a8b96..147118c 100644
|
|
--- a/test/test_gmpy2_mpz_inplace.txt
|
|
+++ b/test/test_gmpy2_mpz_inplace.txt
|
|
@@ -147,18 +147,16 @@ Test ipow operator
|
|
mpz(25)
|
|
>>> x **= xmpz(2); x
|
|
mpz(625)
|
|
->>> x **= -2
|
|
-Traceback (most recent call last):
|
|
- File "<stdin>", line 1, in <module>
|
|
-TypeError: unsupported operand type(s) for ** or pow(): 'mpz' and 'int'
|
|
+>>> x **= -2; x
|
|
+mpfr('2.5600000000000001e-06')
|
|
+>>> x = mpz(625)
|
|
>>> x **= 2; x
|
|
mpz(390625)
|
|
->>> x **= mpfr(2)
|
|
-Traceback (most recent call last):
|
|
- File "<stdin>", line 1, in <module>
|
|
-TypeError: unsupported operand type(s) for ** or pow(): 'mpz' and 'mpfr'
|
|
->>> 1
|
|
-1
|
|
+>>> x **= mpfr(2); x
|
|
+mpfr('152587890625.0')
|
|
+>>> x = mpz(390625)
|
|
+>>> x **= mpfr(-2); x
|
|
+mpfr('6.5535999999999999e-12')
|
|
|
|
Test iand operator
|
|
------------------
|
|
diff --git a/test/test_gmpy2_pow.txt b/test/test_gmpy2_pow.txt
|
|
index 89bd876..d5b1f45 100644
|
|
--- a/test/test_gmpy2_pow.txt
|
|
+++ b/test/test_gmpy2_pow.txt
|
|
@@ -15,9 +15,7 @@ mpz(25)
|
|
>>> ctx.pow(z1, z2)
|
|
mpz(25)
|
|
>>> z1 ** -z2
|
|
-Traceback (most recent call last):
|
|
- File "<stdin>", line 1, in <module>
|
|
-ValueError: pow() exponent cannot be negative
|
|
+mpfr('0.040000000000000001')
|
|
>>> z1 ** 0
|
|
mpz(1)
|
|
>>> mpz(0) ** 32
|
|
diff --git a/test/test_gmpy2_xmpz_inplace.txt b/test/test_gmpy2_xmpz_inplace.txt
|
|
index 94f86b7..c02f966 100644
|
|
--- a/test/test_gmpy2_xmpz_inplace.txt
|
|
+++ b/test/test_gmpy2_xmpz_inplace.txt
|
|
@@ -135,7 +135,7 @@ xmpz(625)
|
|
>>> x **= -2
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 1, in <module>
|
|
-TypeError: unsupported operand type(s) for ** or pow(): 'xmpz' and 'int'
|
|
+ValueError: a non-negative value is required
|
|
>>> x **= 2; x
|
|
xmpz(390625)
|
|
>>> x **= mpfr(2)
|