From e1c69b3f6ff1f86fe5e94a41a877aa08541b62f0 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Thu, 23 Sep 2004 19:22:41 +0000 Subject: [PATCH] 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. --- Objects/floatobject.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 46c05b2ba7c..539c4a9f4ce 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -384,13 +384,11 @@ float_richcompare(PyObject *v, PyObject *w, int op) if (PyFloat_Check(w)) j = PyFloat_AS_DOUBLE(w); - else if (Py_IS_INFINITY(i)) { - /* XXX If we had a reliable way to check whether i is a - * XXX NaN, it would belong in this branch too. - */ + else if (Py_IS_INFINITY(i) || Py_IS_NAN(i)) { if (PyInt_Check(w) || PyLong_Check(w)) - /* The magnitude of i exceeds any finite integer, - * so it doesn't matter which int we compare i with. + /* If i is an infinity, its magnitude exceeds any + * finite integer, so it doesn't matter which int we + * compare i with. If i is a NaN, similarly. */ j = 0.0; else @@ -403,7 +401,7 @@ float_richcompare(PyObject *v, PyObject *w, int op) * Cray single with 48 bits of precision, and long has 64 * bits. */ -#if SIZEOF_LONG > 4 +#if SIZEOF_LONG > 6 unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj); if (abs >> 48) { /* Needs more than 48 bits. Make it take the @@ -443,10 +441,10 @@ float_richcompare(PyObject *v, PyObject *w, int op) nbits = _PyLong_NumBits(w); if (nbits == (size_t)-1 && PyErr_Occurred()) { /* This long is so large that size_t isn't big enough - * to hold the # of Python digits. Replace with - * little doubles that give the same outcome -- - * w is so large that its magnitude must exceed - * the magnitude of any finite float. + * to hold the # of bits. Replace with little doubles + * that give the same outcome -- w is so large that + * its magnitude must exceed the magnitude of any + * finite float. */ PyErr_Clear(); i = (double)vsign;