self.assertIs(Decimal("NaN").fma(7, 1).is_nan(), True)
# three arg power
self.assertEqual(pow(Decimal(10), 2, 7), 2)
+ if self.decimal == C:
+ self.assertEqual(pow(10, Decimal(2), 7), 2)
+ self.assertEqual(pow(10, 2, Decimal(7)), 2)
+ else:
+ # XXX: Three-arg power doesn't use __rpow__.
+ self.assertRaises(TypeError, pow, 10, Decimal(2), 7)
+ # XXX: There is no special method to dispatch on the
+ # third arg of three-arg power.
+ self.assertRaises(TypeError, pow, 10, 2, Decimal(7))
# exp
self.assertEqual(Decimal("1.01").exp(), 3)
# is_normal
return (decimal_state *)state;
}
+static inline decimal_state *
+find_state_ternary(PyObject *left, PyObject *right, PyObject *modulus)
+{
+ PyTypeObject *base;
+ if (PyType_GetBaseByToken(Py_TYPE(left), &dec_spec, &base) != 1) {
+ assert(!PyErr_Occurred());
+ if (PyType_GetBaseByToken(Py_TYPE(right), &dec_spec, &base) != 1) {
+ assert(!PyErr_Occurred());
+ PyType_GetBaseByToken(Py_TYPE(modulus), &dec_spec, &base);
+ }
+ }
+ assert(base != NULL);
+ void *state = _PyType_GetModuleState(base);
+ assert(state != NULL);
+ Py_DECREF(base);
+ return (decimal_state *)state;
+}
+
#if !defined(MPD_VERSION_HEX) || MPD_VERSION_HEX < 0x02050000
#error "libmpdec version >= 2.5.0 required"
PyObject *context;
uint32_t status = 0;
- decimal_state *state = find_state_left_or_right(base, exp);
+ decimal_state *state = find_state_ternary(base, exp, mod);
CURRENT_CONTEXT(state, context);
CONVERT_BINOP(&a, &b, base, exp, context);