[Python-checkins] CVS: python/dist/src/Objects floatobject.c,2.110,2.111
Tim Peters
tim_one@users.sourceforge.net
Fri, 08 Mar 2002 20:58:26 -0800
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv1957/python/Objects
Modified Files:
floatobject.c
Log Message:
SF bug 525705: [2.2] underflow raise OverflowException.
Another year in the quest to out-guess random C behavior.
Added macros Py_ADJUST_ERANGE1(X) and Py_ADJUST_ERANGE2(X, Y). The latter
is useful for functions with complex results. Two corrections to errno-
after-libm-call are attempted:
1. If the platform set errno to ERANGE due to underflow, clear errno.
Some unknown subset of libm versions and link options do this. It's
allowed by C89, but I never figured anyone would do it.
2. If the platform did not set errno but overflow occurred, force
errno to ERANGE. C89 required setting errno to ERANGE, but C99
doesn't. Some unknown subset of libm versions and link options do
it the C99 way now.
Bugfix candidate, but hold off until some Linux people actually try it,
with and without -lieee. I'll send a help plea to Python-Dev.
Index: floatobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/floatobject.c,v
retrieving revision 2.110
retrieving revision 2.111
diff -C2 -d -r2.110 -r2.111
*** floatobject.c 11 Dec 2001 20:31:34 -0000 2.110
--- floatobject.c 9 Mar 2002 04:58:24 -0000 2.111
***************
*** 578,584 ****
ix = pow(iv, iw);
PyFPE_END_PROTECT(ix)
! Py_SET_ERANGE_IF_OVERFLOW(ix);
if (errno != 0) {
! /* XXX could it be another type of error? */
PyErr_SetFromErrno(PyExc_OverflowError);
return NULL;
--- 578,584 ----
ix = pow(iv, iw);
PyFPE_END_PROTECT(ix)
! Py_ADJUST_ERANGE1(ix);
if (errno != 0) {
! assert(errno == ERANGE);
PyErr_SetFromErrno(PyExc_OverflowError);
return NULL;