"Fix" (for certain configurations of the planets, including
recent gcc on Linux/x86)

[ 899109 ] 1==float('nan')

by implementing rich comparisons for floats.

Seems to make comparisons involving NaNs somewhat less surprising
when the underlying C compiler actually implements C99 semantics.
diff --git a/Misc/NEWS b/Misc/NEWS
index 3fdef4b..2d02ed1 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@
 Core and builtins
 -----------------
 
+- Implemented rich comparisons for floats, which seems to make
+  comparisons involving NaNs somewhat less surprising when the
+  underlying C compiler actually implements C99 semantics.
+
 - Optimized list.extend() to save memory and no longer create
   intermediate sequences.  Also, extend() now pre-allocates the
   needed memory whenever the length of the iterable is known in
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 7476ac7..3f06b4c 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -360,6 +360,40 @@
 	return (i < j) ? -1 : (i > j) ? 1 : 0;
 }
 
+static PyObject*
+float_richcompare(PyObject *v, PyObject *w, int op)
+{
+	double i, j;
+	int r = 0;
+
+	CONVERT_TO_DOUBLE(v, i);
+	CONVERT_TO_DOUBLE(w, j);
+
+	PyFPE_START_PROTECT("richcompare", return NULL)
+	switch (op) {
+	case Py_EQ:
+		r = i==j;
+		break;
+	case Py_NE:
+		r = i!=j;
+		break;
+	case Py_LE:
+		r = i<=j;
+		break;
+	case Py_GE:
+		r = i>=j;
+		break;
+	case Py_LT:
+		r = i<j;
+		break;
+	case Py_GT:
+		r = i>j;
+		break;
+	}
+	PyFPE_END_PROTECT(a)
+	return PyBool_FromLong(r);
+}
+
 static long
 float_hash(PyFloatObject *v)
 {
@@ -834,7 +868,7 @@
 	float_doc,				/* tp_doc */
  	0,					/* tp_traverse */
 	0,					/* tp_clear */
-	0,					/* tp_richcompare */
+	(richcmpfunc)float_richcompare,		/* tp_richcompare */
 	0,					/* tp_weaklistoffset */
 	0,					/* tp_iter */
 	0,					/* tp_iternext */