Kaydet (Commit) e1c69b3f authored tarafından Tim Peters's avatar Tim Peters

float_richcompare(): Use the new Py_IS_NAN macro to ensure that, on

platforms where that macro works, NaN compared to an int or long works
the same as NaN compared to a finite float.
üst 862f0593
...@@ -384,13 +384,11 @@ float_richcompare(PyObject *v, PyObject *w, int op) ...@@ -384,13 +384,11 @@ float_richcompare(PyObject *v, PyObject *w, int op)
if (PyFloat_Check(w)) if (PyFloat_Check(w))
j = PyFloat_AS_DOUBLE(w); j = PyFloat_AS_DOUBLE(w);
else if (Py_IS_INFINITY(i)) { else if (Py_IS_INFINITY(i) || Py_IS_NAN(i)) {
/* XXX If we had a reliable way to check whether i is a
* XXX NaN, it would belong in this branch too.
*/
if (PyInt_Check(w) || PyLong_Check(w)) if (PyInt_Check(w) || PyLong_Check(w))
/* The magnitude of i exceeds any finite integer, /* If i is an infinity, its magnitude exceeds any
* so it doesn't matter which int we compare i with. * finite integer, so it doesn't matter which int we
* compare i with. If i is a NaN, similarly.
*/ */
j = 0.0; j = 0.0;
else else
...@@ -403,7 +401,7 @@ float_richcompare(PyObject *v, PyObject *w, int op) ...@@ -403,7 +401,7 @@ float_richcompare(PyObject *v, PyObject *w, int op)
* Cray single with 48 bits of precision, and long has 64 * Cray single with 48 bits of precision, and long has 64
* bits. * bits.
*/ */
#if SIZEOF_LONG > 4 #if SIZEOF_LONG > 6
unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj); unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj);
if (abs >> 48) { if (abs >> 48) {
/* Needs more than 48 bits. Make it take the /* Needs more than 48 bits. Make it take the
...@@ -443,10 +441,10 @@ float_richcompare(PyObject *v, PyObject *w, int op) ...@@ -443,10 +441,10 @@ float_richcompare(PyObject *v, PyObject *w, int op)
nbits = _PyLong_NumBits(w); nbits = _PyLong_NumBits(w);
if (nbits == (size_t)-1 && PyErr_Occurred()) { if (nbits == (size_t)-1 && PyErr_Occurred()) {
/* This long is so large that size_t isn't big enough /* This long is so large that size_t isn't big enough
* to hold the # of Python digits. Replace with * to hold the # of bits. Replace with little doubles
* little doubles that give the same outcome -- * that give the same outcome -- w is so large that
* w is so large that its magnitude must exceed * its magnitude must exceed the magnitude of any
* the magnitude of any finite float. * finite float.
*/ */
PyErr_Clear(); PyErr_Clear();
i = (double)vsign; i = (double)vsign;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment