mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
"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.
This commit is contained in:
parent
bbca8da3ca
commit
d3b33b5f6f
2 changed files with 39 additions and 1 deletions
|
@ -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)
|
||||||
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 = {
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue