Steve Holden <[EMAIL PROTECTED]> wrote:
> Josiah Carlson wrote:
> [yet more on this topic]
> 
> If the brainpower already expended on this issue were proportional to 
> its significance then we'd be reading about it on CNN news.

Goodness, I wasn't aware that pointer manipulation took that much
brainpower.  I presume you mean what others have spent time thinking
about with regards to this topic.


> This thread has disappeared down a rat-hole, never to re-emerge with 
> anything of significant benefit to users. C'mon, guys, implement a patch 
> or leave it alone :-)

Heh.  So be it.  The following is untested (I lack a build system for
the Python trunk).  It adds a new global cache for floats, a new 'fill
the global cache' function, and an updated PyFloat_FromDouble() function.

All in all, it took about 10 minutes to generate, and understands the
difference between fp +0.0 and -0.0 (assuming sane IEEE 754 fp double
behavior on non-x86 platforms).

 - Josiah


/* This should go into floatobject.c */


static PyFloatObject *cached_list = NULL;

static PyFloatObject *
fill_cached_list(void)
{
        cached_list = (PyFloatObject *) 1;
        PyFloatObject *p;
        int i;
        p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatObject)*22);
        if (p == NULL) {
                cached_list = NULL;
                return (PyFloatObject *) PyErr_NoMemory();
        }
        for (i=0;i<=10;i++) {
                p[i] = (PyFloatObject*) PyFloat_fromDouble((double) i);
                p[21-i] = (PyFloatObject*) PyFloat_fromDouble(-((double) i));
        }
        cached_list = NULL;
        return p;
}

PyObject *
PyFloat_FromDouble(double fval)
{
        register PyFloatObject *op;
        register long* fvali = (int*)(&fval);
        if (free_list == NULL) {
                if ((free_list = fill_free_list()) == NULL)
                        return NULL;
        }
        
#ifdef LITTLE_ENDIAN
        if (!p[0])
#else
        if (!p[1])
#endif
        {
                if (cached_list == NULL) {
                        if ((cached_list = fill_cached_list()) == NULL)
                                return NULL;
                }
                if ((cached_list != 1) && (cached_list != NULL)) {
#ifdef LITTLE_ENDIAN
                        switch p[1]
#else
                        switch p[0]
#endif
                        {
                        case 0:  PY_INCREF(cached_list[0]); return 
cached_list[0];
                        case 1072693248:  PY_INCREF(cached_list[1]); return 
cached_list[1];
                        case 1073741824:  PY_INCREF(cached_list[2]); return 
cached_list[2];
                        case 1074266112:  PY_INCREF(cached_list[3]); return 
cached_list[3];
                        case 1074790400:  PY_INCREF(cached_list[4]); return 
cached_list[4];
                        case 1075052544:  PY_INCREF(cached_list[5]); return 
cached_list[5];
                        case 1075314688:  PY_INCREF(cached_list[6]); return 
cached_list[6];
                        case 1075576832:  PY_INCREF(cached_list[7]); return 
cached_list[7];
                        case 1075838976:  PY_INCREF(cached_list[8]); return 
cached_list[8];
                        case 1075970048:  PY_INCREF(cached_list[9]); return 
cached_list[9];
                        case 1076101120:  PY_INCREF(cached_list[10]); return 
cached_list[10];
                        case -1071382528:  PY_INCREF(cached_list[11]); return 
cached_list[11];
                        case -1071513600:  PY_INCREF(cached_list[12]); return 
cached_list[12];
                        case -1071644672:  PY_INCREF(cached_list[13]); return 
cached_list[13];
                        case -1071906816:  PY_INCREF(cached_list[14]); return 
cached_list[14];
                        case -1072168960:  PY_INCREF(cached_list[15]); return 
cached_list[15];
                        case -1072431104:  PY_INCREF(cached_list[16]); return 
cached_list[16];
                        case -1072693248:  PY_INCREF(cached_list[17]); return 
cached_list[17];
                        case -1073217536:  PY_INCREF(cached_list[18]); return 
cached_list[18];
                        case -1073741824:  PY_INCREF(cached_list[19]); return 
cached_list[19];
                        case -1074790400:  PY_INCREF(cached_list[20]); return 
cached_list[20];
                        case -2147483648:  PY_INCREF(cached_list[21]); return 
cached_list[21];
                        default:
                        }
                }

        }
        
        /* Inline PyObject_New */
        op = free_list;
        free_list = (PyFloatObject *)op->ob_type;
        PyObject_INIT(op, &PyFloat_Type);
        op->ob_fval = fval;
        return (PyObject *) op;
}

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to