static PyObject * complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z) { Py_complex p; Py_complex exponent; long int_exponent; if ((PyObject *)z!=Py_None) { PyErr_SetString(PyExc_ValueError, "complex modulo"); return NULL; } PyFPE_START_PROTECT("complex_pow", return 0) errno = 0; exponent = ((PyComplexObject*)w)->cval; int_exponent = (long)exponent.real; if (exponent.imag == 0. && exponent.real == int_exponent) p = c_powi(v->cval,int_exponent); else p = c_pow(v->cval,exponent); PyFPE_END_PROTECT(p) if (errno == ERANGE) { PyErr_SetString(PyExc_ValueError, "0.0 to a negative or complex power"); return NULL; } return PyComplex_FromCComplex(p); }
static PyObject * complex_pow(PyObject *v, PyObject *w, PyObject *z) { Py_complex p; Py_complex exponent; long int_exponent; Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); if (z!=Py_None) { PyErr_SetString(PyExc_ValueError, "complex modulo"); return NULL; } PyFPE_START_PROTECT("complex_pow", return 0) errno = 0; exponent = b; int_exponent = (long)exponent.real; if (exponent.imag == 0. && exponent.real == int_exponent) p = c_powi(a,int_exponent); else p = c_pow(a,exponent); PyFPE_END_PROTECT(p) Py_ADJUST_ERANGE2(p.real, p.imag); if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, "0.0 to a negative or complex power"); return NULL; } else if (errno == ERANGE) { PyErr_SetString(PyExc_OverflowError, "complex exponentiation"); return NULL; } return PyComplex_FromCComplex(p); }