Commit b22bf8e5 authored by Michael W. Hudson's avatar Michael W. Hudson

"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.
parent b6992aa8
...@@ -12,6 +12,10 @@ What's New in Python 2.4 alpha 1? ...@@ -12,6 +12,10 @@ What's New in Python 2.4 alpha 1?
Core and builtins 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 - Optimized list.extend() to save memory and no longer create
intermediate sequences. Also, extend() now pre-allocates the intermediate sequences. Also, extend() now pre-allocates the
needed memory whenever the length of the iterable is known in needed memory whenever the length of the iterable is known in
......
...@@ -360,6 +360,40 @@ float_compare(PyFloatObject *v, PyFloatObject *w) ...@@ -360,6 +360,40 @@ float_compare(PyFloatObject *v, PyFloatObject *w)
return (i < j) ? -1 : (i > j) ? 1 : 0; 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 static long
float_hash(PyFloatObject *v) float_hash(PyFloatObject *v)
{ {
...@@ -834,7 +868,7 @@ PyTypeObject PyFloat_Type = { ...@@ -834,7 +868,7 @@ PyTypeObject PyFloat_Type = {
float_doc, /* tp_doc */ float_doc, /* tp_doc */
0, /* tp_traverse */ 0, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ (richcmpfunc)float_richcompare, /* tp_richcompare */
0, /* tp_weaklistoffset */ 0, /* tp_weaklistoffset */
0, /* tp_iter */ 0, /* tp_iter */
0, /* tp_iternext */ 0, /* tp_iternext */
......
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