New restriction on pow(x, y, z): If z is not None, x and y must be of

integer types, and y must be >= 0.  See discussion at
http://sf.net/tracker/index.php?func=detail&aid=457066&group_id=5470&atid=105470
This commit is contained in:
Tim Peters 2001-09-03 08:35:41 +00:00
parent 5d2b77cf31
commit 32f453eaa4
9 changed files with 79 additions and 49 deletions

View file

@ -492,11 +492,13 @@ static PyObject *
float_pow(PyObject *v, PyObject *w, PyObject *z)
{
double iv, iw, ix;
/* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
* The z parameter is really only going to be useful for integers and
* long integers. Maybe something clever with logarithms could be done.
* [AMK]
*/
if ((PyObject *)z != Py_None) {
PyErr_SetString(PyExc_TypeError,
"3rd argument to floating pow() must be None");
return NULL;
}
CONVERT_TO_DOUBLE(v, iv);
CONVERT_TO_DOUBLE(w, iw);
@ -538,16 +540,6 @@ float_pow(PyObject *v, PyObject *w, PyObject *z)
PyErr_SetFromErrno(PyExc_OverflowError);
return NULL;
}
if ((PyObject *)z != Py_None) {
double iz;
CONVERT_TO_DOUBLE(z, iz);
PyFPE_START_PROTECT("pow", return 0)
ix = fmod(ix, iz); /* XXX To Be Rewritten */
if (ix != 0 && ((iv < 0 && iz > 0) || (iv > 0 && iz < 0) )) {
ix += iz;
}
PyFPE_END_PROTECT(ix)
}
return PyFloat_FromDouble(ix);
}