Skip to content

Commit d9b1154

Browse files
authored
Merge pull request #251 from SwayamInSync/249
2 parents b266dc6 + 64bb22c commit d9b1154

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

quaddtype/numpy_quaddtype/src/scalar_ops.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,23 @@ QuadPrecision_int(QuadPrecisionObject *self)
228228
}
229229
}
230230

231+
template <binary_op_quad_def sleef_op, binary_op_longdouble_def longdouble_op>
232+
static PyObject *
233+
quad_ternary_power_func(PyObject *op1, PyObject *op2, PyObject *mod)
234+
{
235+
if (mod != Py_None) {
236+
PyErr_SetString(PyExc_TypeError,
237+
"pow() 3rd argument not allowed unless all arguments are integers");
238+
return NULL;
239+
}
240+
return quad_binary_func<sleef_op, longdouble_op>(op1, op2);
241+
}
242+
231243
PyNumberMethods quad_as_scalar = {
232244
.nb_add = (binaryfunc)quad_binary_func<quad_add, ld_add>,
233245
.nb_subtract = (binaryfunc)quad_binary_func<quad_sub, ld_sub>,
234246
.nb_multiply = (binaryfunc)quad_binary_func<quad_mul, ld_mul>,
235-
.nb_power = (ternaryfunc)quad_binary_func<quad_pow, ld_pow>,
247+
.nb_power = (ternaryfunc)quad_ternary_power_func<quad_pow, ld_pow>,
236248
.nb_negative = (unaryfunc)quad_unary_func<quad_negative, ld_negative>,
237249
.nb_positive = (unaryfunc)quad_unary_func<quad_positive, ld_positive>,
238250
.nb_absolute = (unaryfunc)quad_unary_func<quad_absolute, ld_absolute>,

quaddtype/tests/test_quaddtype.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5411,4 +5411,13 @@ def test_float_to_quad_sign_preserve(dtype, val):
54115411
if np.isnan(val):
54125412
assert np.isnan(result), f"NaN failed for {dtype}"
54135413
else:
5414-
assert result == val, f"{val} failed for {dtype}"
5414+
assert result == val, f"{val} failed for {dtype}"
5415+
5416+
@pytest.mark.parametrize("val, pow", [(2, 112), (2, -112), (10, 34), (10, -34)])
5417+
def test_quadprecision_large_exponents(val, pow):
5418+
mp.prec = 113
5419+
mp_value = mp.mpf(val) ** pow
5420+
value = QuadPrecision(val) ** pow
5421+
value_str = mp.nstr(mp.mpf(str(value)), 33)
5422+
expected_str = mp.nstr(mp_value, 33)
5423+
assert value_str == expected_str, f"QuadPrecision({val}) ** {pow} = {value_str}, expected {expected_str}"

0 commit comments

Comments
 (0)