diff --git a/quaddtype/numpy_quaddtype/src/scalar_ops.cpp b/quaddtype/numpy_quaddtype/src/scalar_ops.cpp index 2898034f..3c4a31a3 100644 --- a/quaddtype/numpy_quaddtype/src/scalar_ops.cpp +++ b/quaddtype/numpy_quaddtype/src/scalar_ops.cpp @@ -228,11 +228,23 @@ QuadPrecision_int(QuadPrecisionObject *self) } } +template +static PyObject * +quad_ternary_power_func(PyObject *op1, PyObject *op2, PyObject *mod) +{ + if (mod != Py_None) { + PyErr_SetString(PyExc_TypeError, + "pow() 3rd argument not allowed unless all arguments are integers"); + return NULL; + } + return quad_binary_func(op1, op2); +} + PyNumberMethods quad_as_scalar = { .nb_add = (binaryfunc)quad_binary_func, .nb_subtract = (binaryfunc)quad_binary_func, .nb_multiply = (binaryfunc)quad_binary_func, - .nb_power = (ternaryfunc)quad_binary_func, + .nb_power = (ternaryfunc)quad_ternary_power_func, .nb_negative = (unaryfunc)quad_unary_func, .nb_positive = (unaryfunc)quad_unary_func, .nb_absolute = (unaryfunc)quad_unary_func, diff --git a/quaddtype/tests/test_quaddtype.py b/quaddtype/tests/test_quaddtype.py index d7b43687..7b73ec11 100644 --- a/quaddtype/tests/test_quaddtype.py +++ b/quaddtype/tests/test_quaddtype.py @@ -5411,4 +5411,13 @@ def test_float_to_quad_sign_preserve(dtype, val): if np.isnan(val): assert np.isnan(result), f"NaN failed for {dtype}" else: - assert result == val, f"{val} failed for {dtype}" \ No newline at end of file + assert result == val, f"{val} failed for {dtype}" + +@pytest.mark.parametrize("val, pow", [(2, 112), (2, -112), (10, 34), (10, -34)]) +def test_quadprecision_large_exponents(val, pow): + mp.prec = 113 + mp_value = mp.mpf(val) ** pow + value = QuadPrecision(val) ** pow + value_str = mp.nstr(mp.mpf(str(value)), 33) + expected_str = mp.nstr(mp_value, 33) + assert value_str == expected_str, f"QuadPrecision({val}) ** {pow} = {value_str}, expected {expected_str}"