SF bug #444510: int() should guarantee truncation.
It's guaranteed now, assuming the platform modf() works correctly.
This commit is contained in:
parent
7cf92fa1c8
commit
7321ec437b
|
@ -338,9 +338,7 @@ module from which it is called).
|
||||||
\exception{TypeError} is raised.
|
\exception{TypeError} is raised.
|
||||||
Otherwise, the argument may be a plain or
|
Otherwise, the argument may be a plain or
|
||||||
long integer or a floating point number. Conversion of floating
|
long integer or a floating point number. Conversion of floating
|
||||||
point numbers to integers is defined by the C semantics; normally
|
point numbers to integers truncates (towards zero).
|
||||||
the conversion truncates towards zero.\footnote{This is ugly --- the
|
|
||||||
language definition should require truncation towards zero.}
|
|
||||||
\end{funcdesc}
|
\end{funcdesc}
|
||||||
|
|
||||||
\begin{funcdesc}{intern}{string}
|
\begin{funcdesc}{intern}{string}
|
||||||
|
|
|
@ -366,6 +366,19 @@ except ValueError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
raise TestFailed, "int(%s)" % `s[1:]` + " should raise ValueError"
|
raise TestFailed, "int(%s)" % `s[1:]` + " should raise ValueError"
|
||||||
|
try:
|
||||||
|
int(1e100)
|
||||||
|
except OverflowError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise TestFailed("int(1e100) expected OverflowError")
|
||||||
|
try:
|
||||||
|
int(-1e100)
|
||||||
|
except OverflowError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise TestFailed("int(-1e100) expected OverflowError")
|
||||||
|
|
||||||
|
|
||||||
# SF bug 434186: 0x80000000/2 != 0x80000000>>1.
|
# SF bug 434186: 0x80000000/2 != 0x80000000>>1.
|
||||||
# Worked by accident in Windows release build, but failed in debug build.
|
# Worked by accident in Windows release build, but failed in debug build.
|
||||||
|
|
|
@ -606,14 +606,20 @@ static PyObject *
|
||||||
float_int(PyObject *v)
|
float_int(PyObject *v)
|
||||||
{
|
{
|
||||||
double x = PyFloat_AsDouble(v);
|
double x = PyFloat_AsDouble(v);
|
||||||
if (x < 0 ? (x = ceil(x)) < (double)LONG_MIN
|
double wholepart; /* integral portion of x, rounded toward 0 */
|
||||||
: (x = floor(x)) > (double)LONG_MAX) {
|
long aslong; /* (long)wholepart */
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
|
||||||
"float too large to convert");
|
(void)modf(x, &wholepart);
|
||||||
|
/* doubles may have more bits than longs, or vice versa; and casting
|
||||||
|
to long may yield gibberish in either case. What really matters
|
||||||
|
is whether converting back to double again reproduces what we
|
||||||
|
started with. */
|
||||||
|
aslong = (long)wholepart;
|
||||||
|
if ((double)aslong == wholepart)
|
||||||
|
return PyInt_FromLong(aslong);
|
||||||
|
PyErr_SetString(PyExc_OverflowError, "float too large to convert");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return PyInt_FromLong((long)x);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
float_long(PyObject *v)
|
float_long(PyObject *v)
|
||||||
|
|
Loading…
Reference in New Issue