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) 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); }
static PyObject * math_1(PyObject *args, Py_complex (*func)(Py_complex)) { Py_complex x; if (!PyArg_ParseTuple(args, "D", &x)) return NULL; errno = 0; PyFPE_START_PROTECT("complex function", return 0) x = (*func)(x); PyFPE_END_PROTECT(x) Py_ADJUST_ERANGE2(x.real, x.imag); if (errno != 0) return math_error(); else return PyComplex_FromCComplex(x); }
static PyObject * cmath_log(PyObject *self, PyObject *args) { Py_complex x; Py_complex y; if (!PyArg_ParseTuple(args, "D|D", &x, &y)) return NULL; errno = 0; PyFPE_START_PROTECT("complex function", return 0) x = c_log(x); if (PyTuple_GET_SIZE(args) == 2) x = c_quot(x, c_log(y)); PyFPE_END_PROTECT(x) if (errno != 0) return math_error(); Py_ADJUST_ERANGE2(x.real, x.imag); return PyComplex_FromCComplex(x); }