Home | History | Annotate | Download | only in Objects
      1 
      2 /* Float object implementation */
      3 
      4 /* XXX There should be overflow checks here, but it's hard to check
      5    for any kind of float exception without losing portability. */
      6 
      7 #include "Python.h"
      8 #include "structseq.h"
      9 
     10 #include <ctype.h>
     11 #include <float.h>
     12 
     13 #undef MAX
     14 #undef MIN
     15 #define MAX(x, y) ((x) < (y) ? (y) : (x))
     16 #define MIN(x, y) ((x) < (y) ? (x) : (y))
     17 
     18 #ifdef _OSF_SOURCE
     19 /* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
     20 extern int finite(double);
     21 #endif
     22 
     23 /* Special free list -- see comments for same code in intobject.c. */
     24 #define BLOCK_SIZE      1000    /* 1K less typical malloc overhead */
     25 #define BHEAD_SIZE      8       /* Enough for a 64-bit pointer */
     26 #define N_FLOATOBJECTS  ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
     27 
     28 struct _floatblock {
     29     struct _floatblock *next;
     30     PyFloatObject objects[N_FLOATOBJECTS];
     31 };
     32 
     33 typedef struct _floatblock PyFloatBlock;
     34 
     35 static PyFloatBlock *block_list = NULL;
     36 static PyFloatObject *free_list = NULL;
     37 
     38 static PyFloatObject *
     39 fill_free_list(void)
     40 {
     41     PyFloatObject *p, *q;
     42     /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
     43     p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
     44     if (p == NULL)
     45         return (PyFloatObject *) PyErr_NoMemory();
     46     ((PyFloatBlock *)p)->next = block_list;
     47     block_list = (PyFloatBlock *)p;
     48     p = &((PyFloatBlock *)p)->objects[0];
     49     q = p + N_FLOATOBJECTS;
     50     while (--q > p)
     51         Py_TYPE(q) = (struct _typeobject *)(q-1);
     52     Py_TYPE(q) = NULL;
     53     return p + N_FLOATOBJECTS - 1;
     54 }
     55 
     56 double
     57 PyFloat_GetMax(void)
     58 {
     59     return DBL_MAX;
     60 }
     61 
     62 double
     63 PyFloat_GetMin(void)
     64 {
     65     return DBL_MIN;
     66 }
     67 
     68 static PyTypeObject FloatInfoType = {0, 0, 0, 0, 0, 0};
     69 
     70 PyDoc_STRVAR(floatinfo__doc__,
     71 "sys.float_info\n\
     72 \n\
     73 A structseq holding information about the float type. It contains low level\n\
     74 information about the precision and internal representation. Please study\n\
     75 your system's :file:`float.h` for more information.");
     76 
     77 static PyStructSequence_Field floatinfo_fields[] = {
     78     {"max",             "DBL_MAX -- maximum representable finite float"},
     79     {"max_exp",         "DBL_MAX_EXP -- maximum int e such that radix**(e-1) "
     80                     "is representable"},
     81     {"max_10_exp",      "DBL_MAX_10_EXP -- maximum int e such that 10**e "
     82                     "is representable"},
     83     {"min",             "DBL_MIN -- Minimum positive normalizer float"},
     84     {"min_exp",         "DBL_MIN_EXP -- minimum int e such that radix**(e-1) "
     85                     "is a normalized float"},
     86     {"min_10_exp",      "DBL_MIN_10_EXP -- minimum int e such that 10**e is "
     87                     "a normalized"},
     88     {"dig",             "DBL_DIG -- digits"},
     89     {"mant_dig",        "DBL_MANT_DIG -- mantissa digits"},
     90     {"epsilon",         "DBL_EPSILON -- Difference between 1 and the next "
     91                     "representable float"},
     92     {"radix",           "FLT_RADIX -- radix of exponent"},
     93     {"rounds",          "FLT_ROUNDS -- addition rounds"},
     94     {0}
     95 };
     96 
     97 static PyStructSequence_Desc floatinfo_desc = {
     98     "sys.float_info",           /* name */
     99     floatinfo__doc__,           /* doc */
    100     floatinfo_fields,           /* fields */
    101     11
    102 };
    103 
    104 PyObject *
    105 PyFloat_GetInfo(void)
    106 {
    107     PyObject* floatinfo;
    108     int pos = 0;
    109 
    110     floatinfo = PyStructSequence_New(&FloatInfoType);
    111     if (floatinfo == NULL) {
    112         return NULL;
    113     }
    114 
    115 #define SetIntFlag(flag) \
    116     PyStructSequence_SET_ITEM(floatinfo, pos++, PyInt_FromLong(flag))
    117 #define SetDblFlag(flag) \
    118     PyStructSequence_SET_ITEM(floatinfo, pos++, PyFloat_FromDouble(flag))
    119 
    120     SetDblFlag(DBL_MAX);
    121     SetIntFlag(DBL_MAX_EXP);
    122     SetIntFlag(DBL_MAX_10_EXP);
    123     SetDblFlag(DBL_MIN);
    124     SetIntFlag(DBL_MIN_EXP);
    125     SetIntFlag(DBL_MIN_10_EXP);
    126     SetIntFlag(DBL_DIG);
    127     SetIntFlag(DBL_MANT_DIG);
    128     SetDblFlag(DBL_EPSILON);
    129     SetIntFlag(FLT_RADIX);
    130     SetIntFlag(FLT_ROUNDS);
    131 #undef SetIntFlag
    132 #undef SetDblFlag
    133 
    134     if (PyErr_Occurred()) {
    135         Py_CLEAR(floatinfo);
    136         return NULL;
    137     }
    138     return floatinfo;
    139 }
    140 
    141 PyObject *
    142 PyFloat_FromDouble(double fval)
    143 {
    144     register PyFloatObject *op;
    145     if (free_list == NULL) {
    146         if ((free_list = fill_free_list()) == NULL)
    147             return NULL;
    148     }
    149     /* Inline PyObject_New */
    150     op = free_list;
    151     free_list = (PyFloatObject *)Py_TYPE(op);
    152     PyObject_INIT(op, &PyFloat_Type);
    153     op->ob_fval = fval;
    154     return (PyObject *) op;
    155 }
    156 
    157 /**************************************************************************
    158 RED_FLAG 22-Sep-2000 tim
    159 PyFloat_FromString's pend argument is braindead.  Prior to this RED_FLAG,
    160 
    161 1.  If v was a regular string, *pend was set to point to its terminating
    162     null byte.  That's useless (the caller can find that without any
    163     help from this function!).
    164 
    165 2.  If v was a Unicode string, or an object convertible to a character
    166     buffer, *pend was set to point into stack trash (the auto temp
    167     vector holding the character buffer).  That was downright dangerous.
    168 
    169 Since we can't change the interface of a public API function, pend is
    170 still supported but now *officially* useless:  if pend is not NULL,
    171 *pend is set to NULL.
    172 **************************************************************************/
    173 PyObject *
    174 PyFloat_FromString(PyObject *v, char **pend)
    175 {
    176     const char *s, *last, *end;
    177     double x;
    178     char buffer[256]; /* for errors */
    179 #ifdef Py_USING_UNICODE
    180     char *s_buffer = NULL;
    181 #endif
    182     Py_ssize_t len;
    183     PyObject *result = NULL;
    184 
    185     if (pend)
    186         *pend = NULL;
    187     if (PyString_Check(v)) {
    188         s = PyString_AS_STRING(v);
    189         len = PyString_GET_SIZE(v);
    190     }
    191 #ifdef Py_USING_UNICODE
    192     else if (PyUnicode_Check(v)) {
    193         s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v)+1);
    194         if (s_buffer == NULL)
    195             return PyErr_NoMemory();
    196         if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
    197                                     PyUnicode_GET_SIZE(v),
    198                                     s_buffer,
    199                                     NULL))
    200             goto error;
    201         s = s_buffer;
    202         len = strlen(s);
    203     }
    204 #endif
    205     else if (PyObject_AsCharBuffer(v, &s, &len)) {
    206         PyErr_SetString(PyExc_TypeError,
    207             "float() argument must be a string or a number");
    208         return NULL;
    209     }
    210     last = s + len;
    211 
    212     while (Py_ISSPACE(*s))
    213         s++;
    214     /* We don't care about overflow or underflow.  If the platform
    215      * supports them, infinities and signed zeroes (on underflow) are
    216      * fine. */
    217     x = PyOS_string_to_double(s, (char **)&end, NULL);
    218     if (x == -1.0 && PyErr_Occurred())
    219         goto error;
    220     while (Py_ISSPACE(*end))
    221         end++;
    222     if (end == last)
    223         result = PyFloat_FromDouble(x);
    224     else {
    225         PyOS_snprintf(buffer, sizeof(buffer),
    226                       "invalid literal for float(): %.200s", s);
    227         PyErr_SetString(PyExc_ValueError, buffer);
    228         result = NULL;
    229     }
    230 
    231   error:
    232 #ifdef Py_USING_UNICODE
    233     if (s_buffer)
    234         PyMem_FREE(s_buffer);
    235 #endif
    236     return result;
    237 }
    238 
    239 static void
    240 float_dealloc(PyFloatObject *op)
    241 {
    242     if (PyFloat_CheckExact(op)) {
    243         Py_TYPE(op) = (struct _typeobject *)free_list;
    244         free_list = op;
    245     }
    246     else
    247         Py_TYPE(op)->tp_free((PyObject *)op);
    248 }
    249 
    250 double
    251 PyFloat_AsDouble(PyObject *op)
    252 {
    253     PyNumberMethods *nb;
    254     PyFloatObject *fo;
    255     double val;
    256 
    257     if (op && PyFloat_Check(op))
    258         return PyFloat_AS_DOUBLE((PyFloatObject*) op);
    259 
    260     if (op == NULL) {
    261         PyErr_BadArgument();
    262         return -1;
    263     }
    264 
    265     if ((nb = Py_TYPE(op)->tp_as_number) == NULL || nb->nb_float == NULL) {
    266         PyErr_SetString(PyExc_TypeError, "a float is required");
    267         return -1;
    268     }
    269 
    270     fo = (PyFloatObject*) (*nb->nb_float) (op);
    271     if (fo == NULL)
    272         return -1;
    273     if (!PyFloat_Check(fo)) {
    274         Py_DECREF(fo);
    275         PyErr_SetString(PyExc_TypeError,
    276                         "nb_float should return float object");
    277         return -1;
    278     }
    279 
    280     val = PyFloat_AS_DOUBLE(fo);
    281     Py_DECREF(fo);
    282 
    283     return val;
    284 }
    285 
    286 /* Methods */
    287 
    288 /* Macro and helper that convert PyObject obj to a C double and store
    289    the value in dbl; this replaces the functionality of the coercion
    290    slot function.  If conversion to double raises an exception, obj is
    291    set to NULL, and the function invoking this macro returns NULL.  If
    292    obj is not of float, int or long type, Py_NotImplemented is incref'ed,
    293    stored in obj, and returned from the function invoking this macro.
    294 */
    295 #define CONVERT_TO_DOUBLE(obj, dbl)                     \
    296     if (PyFloat_Check(obj))                             \
    297         dbl = PyFloat_AS_DOUBLE(obj);                   \
    298     else if (convert_to_double(&(obj), &(dbl)) < 0)     \
    299         return obj;
    300 
    301 static int
    302 convert_to_double(PyObject **v, double *dbl)
    303 {
    304     register PyObject *obj = *v;
    305 
    306     if (PyInt_Check(obj)) {
    307         *dbl = (double)PyInt_AS_LONG(obj);
    308     }
    309     else if (PyLong_Check(obj)) {
    310         *dbl = PyLong_AsDouble(obj);
    311         if (*dbl == -1.0 && PyErr_Occurred()) {
    312             *v = NULL;
    313             return -1;
    314         }
    315     }
    316     else {
    317         Py_INCREF(Py_NotImplemented);
    318         *v = Py_NotImplemented;
    319         return -1;
    320     }
    321     return 0;
    322 }
    323 
    324 /* XXX PyFloat_AsString and PyFloat_AsReprString are deprecated:
    325    XXX they pass a char buffer without passing a length.
    326 */
    327 void
    328 PyFloat_AsString(char *buf, PyFloatObject *v)
    329 {
    330     char *tmp = PyOS_double_to_string(v->ob_fval, 'g',
    331                     PyFloat_STR_PRECISION,
    332                     Py_DTSF_ADD_DOT_0, NULL);
    333     strcpy(buf, tmp);
    334     PyMem_Free(tmp);
    335 }
    336 
    337 void
    338 PyFloat_AsReprString(char *buf, PyFloatObject *v)
    339 {
    340     char * tmp = PyOS_double_to_string(v->ob_fval, 'r', 0,
    341                     Py_DTSF_ADD_DOT_0, NULL);
    342     strcpy(buf, tmp);
    343     PyMem_Free(tmp);
    344 }
    345 
    346 /* ARGSUSED */
    347 static int
    348 float_print(PyFloatObject *v, FILE *fp, int flags)
    349 {
    350     char *buf;
    351     if (flags & Py_PRINT_RAW)
    352         buf = PyOS_double_to_string(v->ob_fval,
    353                                     'g', PyFloat_STR_PRECISION,
    354                                     Py_DTSF_ADD_DOT_0, NULL);
    355     else
    356         buf = PyOS_double_to_string(v->ob_fval,
    357                             'r', 0, Py_DTSF_ADD_DOT_0, NULL);
    358     Py_BEGIN_ALLOW_THREADS
    359     fputs(buf, fp);
    360     Py_END_ALLOW_THREADS
    361     PyMem_Free(buf);
    362     return 0;
    363 }
    364 
    365 static PyObject *
    366 float_str_or_repr(PyFloatObject *v, int precision, char format_code)
    367 {
    368     PyObject *result;
    369     char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
    370                                   format_code, precision,
    371                                   Py_DTSF_ADD_DOT_0,
    372                                   NULL);
    373     if (!buf)
    374         return PyErr_NoMemory();
    375     result = PyString_FromString(buf);
    376     PyMem_Free(buf);
    377     return result;
    378 }
    379 
    380 static PyObject *
    381 float_repr(PyFloatObject *v)
    382 {
    383     return float_str_or_repr(v, 0, 'r');
    384 }
    385 
    386 static PyObject *
    387 float_str(PyFloatObject *v)
    388 {
    389     return float_str_or_repr(v, PyFloat_STR_PRECISION, 'g');
    390 }
    391 
    392 /* Comparison is pretty much a nightmare.  When comparing float to float,
    393  * we do it as straightforwardly (and long-windedly) as conceivable, so
    394  * that, e.g., Python x == y delivers the same result as the platform
    395  * C x == y when x and/or y is a NaN.
    396  * When mixing float with an integer type, there's no good *uniform* approach.
    397  * Converting the double to an integer obviously doesn't work, since we
    398  * may lose info from fractional bits.  Converting the integer to a double
    399  * also has two failure modes:  (1) a long int may trigger overflow (too
    400  * large to fit in the dynamic range of a C double); (2) even a C long may have
    401  * more bits than fit in a C double (e.g., on a a 64-bit box long may have
    402  * 63 bits of precision, but a C double probably has only 53), and then
    403  * we can falsely claim equality when low-order integer bits are lost by
    404  * coercion to double.  So this part is painful too.
    405  */
    406 
    407 static PyObject*
    408 float_richcompare(PyObject *v, PyObject *w, int op)
    409 {
    410     double i, j;
    411     int r = 0;
    412 
    413     assert(PyFloat_Check(v));
    414     i = PyFloat_AS_DOUBLE(v);
    415 
    416     /* Switch on the type of w.  Set i and j to doubles to be compared,
    417      * and op to the richcomp to use.
    418      */
    419     if (PyFloat_Check(w))
    420         j = PyFloat_AS_DOUBLE(w);
    421 
    422     else if (!Py_IS_FINITE(i)) {
    423         if (PyInt_Check(w) || PyLong_Check(w))
    424             /* If i is an infinity, its magnitude exceeds any
    425              * finite integer, so it doesn't matter which int we
    426              * compare i with.  If i is a NaN, similarly.
    427              */
    428             j = 0.0;
    429         else
    430             goto Unimplemented;
    431     }
    432 
    433     else if (PyInt_Check(w)) {
    434         long jj = PyInt_AS_LONG(w);
    435         /* In the worst realistic case I can imagine, C double is a
    436          * Cray single with 48 bits of precision, and long has 64
    437          * bits.
    438          */
    439 #if SIZEOF_LONG > 6
    440         unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj);
    441         if (abs >> 48) {
    442             /* Needs more than 48 bits.  Make it take the
    443              * PyLong path.
    444              */
    445             PyObject *result;
    446             PyObject *ww = PyLong_FromLong(jj);
    447 
    448             if (ww == NULL)
    449                 return NULL;
    450             result = float_richcompare(v, ww, op);
    451             Py_DECREF(ww);
    452             return result;
    453         }
    454 #endif
    455         j = (double)jj;
    456         assert((long)j == jj);
    457     }
    458 
    459     else if (PyLong_Check(w)) {
    460         int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
    461         int wsign = _PyLong_Sign(w);
    462         size_t nbits;
    463         int exponent;
    464 
    465         if (vsign != wsign) {
    466             /* Magnitudes are irrelevant -- the signs alone
    467              * determine the outcome.
    468              */
    469             i = (double)vsign;
    470             j = (double)wsign;
    471             goto Compare;
    472         }
    473         /* The signs are the same. */
    474         /* Convert w to a double if it fits.  In particular, 0 fits. */
    475         nbits = _PyLong_NumBits(w);
    476         if (nbits == (size_t)-1 && PyErr_Occurred()) {
    477             /* This long is so large that size_t isn't big enough
    478              * to hold the # of bits.  Replace with little doubles
    479              * that give the same outcome -- w is so large that
    480              * its magnitude must exceed the magnitude of any
    481              * finite float.
    482              */
    483             PyErr_Clear();
    484             i = (double)vsign;
    485             assert(wsign != 0);
    486             j = wsign * 2.0;
    487             goto Compare;
    488         }
    489         if (nbits <= 48) {
    490             j = PyLong_AsDouble(w);
    491             /* It's impossible that <= 48 bits overflowed. */
    492             assert(j != -1.0 || ! PyErr_Occurred());
    493             goto Compare;
    494         }
    495         assert(wsign != 0); /* else nbits was 0 */
    496         assert(vsign != 0); /* if vsign were 0, then since wsign is
    497                              * not 0, we would have taken the
    498                              * vsign != wsign branch at the start */
    499         /* We want to work with non-negative numbers. */
    500         if (vsign < 0) {
    501             /* "Multiply both sides" by -1; this also swaps the
    502              * comparator.
    503              */
    504             i = -i;
    505             op = _Py_SwappedOp[op];
    506         }
    507         assert(i > 0.0);
    508         (void) frexp(i, &exponent);
    509         /* exponent is the # of bits in v before the radix point;
    510          * we know that nbits (the # of bits in w) > 48 at this point
    511          */
    512         if (exponent < 0 || (size_t)exponent < nbits) {
    513             i = 1.0;
    514             j = 2.0;
    515             goto Compare;
    516         }
    517         if ((size_t)exponent > nbits) {
    518             i = 2.0;
    519             j = 1.0;
    520             goto Compare;
    521         }
    522         /* v and w have the same number of bits before the radix
    523          * point.  Construct two longs that have the same comparison
    524          * outcome.
    525          */
    526         {
    527             double fracpart;
    528             double intpart;
    529             PyObject *result = NULL;
    530             PyObject *one = NULL;
    531             PyObject *vv = NULL;
    532             PyObject *ww = w;
    533 
    534             if (wsign < 0) {
    535                 ww = PyNumber_Negative(w);
    536                 if (ww == NULL)
    537                     goto Error;
    538             }
    539             else
    540                 Py_INCREF(ww);
    541 
    542             fracpart = modf(i, &intpart);
    543             vv = PyLong_FromDouble(intpart);
    544             if (vv == NULL)
    545                 goto Error;
    546 
    547             if (fracpart != 0.0) {
    548                 /* Shift left, and or a 1 bit into vv
    549                  * to represent the lost fraction.
    550                  */
    551                 PyObject *temp;
    552 
    553                 one = PyInt_FromLong(1);
    554                 if (one == NULL)
    555                     goto Error;
    556 
    557                 temp = PyNumber_Lshift(ww, one);
    558                 if (temp == NULL)
    559                     goto Error;
    560                 Py_DECREF(ww);
    561                 ww = temp;
    562 
    563                 temp = PyNumber_Lshift(vv, one);
    564                 if (temp == NULL)
    565                     goto Error;
    566                 Py_DECREF(vv);
    567                 vv = temp;
    568 
    569                 temp = PyNumber_Or(vv, one);
    570                 if (temp == NULL)
    571                     goto Error;
    572                 Py_DECREF(vv);
    573                 vv = temp;
    574             }
    575 
    576             r = PyObject_RichCompareBool(vv, ww, op);
    577             if (r < 0)
    578                 goto Error;
    579             result = PyBool_FromLong(r);
    580          Error:
    581             Py_XDECREF(vv);
    582             Py_XDECREF(ww);
    583             Py_XDECREF(one);
    584             return result;
    585         }
    586     } /* else if (PyLong_Check(w)) */
    587 
    588     else        /* w isn't float, int, or long */
    589         goto Unimplemented;
    590 
    591  Compare:
    592     PyFPE_START_PROTECT("richcompare", return NULL)
    593     switch (op) {
    594     case Py_EQ:
    595         r = i == j;
    596         break;
    597     case Py_NE:
    598         r = i != j;
    599         break;
    600     case Py_LE:
    601         r = i <= j;
    602         break;
    603     case Py_GE:
    604         r = i >= j;
    605         break;
    606     case Py_LT:
    607         r = i < j;
    608         break;
    609     case Py_GT:
    610         r = i > j;
    611         break;
    612     }
    613     PyFPE_END_PROTECT(r)
    614     return PyBool_FromLong(r);
    615 
    616  Unimplemented:
    617     Py_INCREF(Py_NotImplemented);
    618     return Py_NotImplemented;
    619 }
    620 
    621 static long
    622 float_hash(PyFloatObject *v)
    623 {
    624     return _Py_HashDouble(v->ob_fval);
    625 }
    626 
    627 static PyObject *
    628 float_add(PyObject *v, PyObject *w)
    629 {
    630     double a,b;
    631     CONVERT_TO_DOUBLE(v, a);
    632     CONVERT_TO_DOUBLE(w, b);
    633     PyFPE_START_PROTECT("add", return 0)
    634     a = a + b;
    635     PyFPE_END_PROTECT(a)
    636     return PyFloat_FromDouble(a);
    637 }
    638 
    639 static PyObject *
    640 float_sub(PyObject *v, PyObject *w)
    641 {
    642     double a,b;
    643     CONVERT_TO_DOUBLE(v, a);
    644     CONVERT_TO_DOUBLE(w, b);
    645     PyFPE_START_PROTECT("subtract", return 0)
    646     a = a - b;
    647     PyFPE_END_PROTECT(a)
    648     return PyFloat_FromDouble(a);
    649 }
    650 
    651 static PyObject *
    652 float_mul(PyObject *v, PyObject *w)
    653 {
    654     double a,b;
    655     CONVERT_TO_DOUBLE(v, a);
    656     CONVERT_TO_DOUBLE(w, b);
    657     PyFPE_START_PROTECT("multiply", return 0)
    658     a = a * b;
    659     PyFPE_END_PROTECT(a)
    660     return PyFloat_FromDouble(a);
    661 }
    662 
    663 static PyObject *
    664 float_div(PyObject *v, PyObject *w)
    665 {
    666     double a,b;
    667     CONVERT_TO_DOUBLE(v, a);
    668     CONVERT_TO_DOUBLE(w, b);
    669 #ifdef Py_NAN
    670     if (b == 0.0) {
    671         PyErr_SetString(PyExc_ZeroDivisionError,
    672                         "float division by zero");
    673         return NULL;
    674     }
    675 #endif
    676     PyFPE_START_PROTECT("divide", return 0)
    677     a = a / b;
    678     PyFPE_END_PROTECT(a)
    679     return PyFloat_FromDouble(a);
    680 }
    681 
    682 static PyObject *
    683 float_classic_div(PyObject *v, PyObject *w)
    684 {
    685     double a,b;
    686     CONVERT_TO_DOUBLE(v, a);
    687     CONVERT_TO_DOUBLE(w, b);
    688     if (Py_DivisionWarningFlag >= 2 &&
    689         PyErr_Warn(PyExc_DeprecationWarning, "classic float division") < 0)
    690         return NULL;
    691 #ifdef Py_NAN
    692     if (b == 0.0) {
    693         PyErr_SetString(PyExc_ZeroDivisionError,
    694                         "float division by zero");
    695         return NULL;
    696     }
    697 #endif
    698     PyFPE_START_PROTECT("divide", return 0)
    699     a = a / b;
    700     PyFPE_END_PROTECT(a)
    701     return PyFloat_FromDouble(a);
    702 }
    703 
    704 static PyObject *
    705 float_rem(PyObject *v, PyObject *w)
    706 {
    707     double vx, wx;
    708     double mod;
    709     CONVERT_TO_DOUBLE(v, vx);
    710     CONVERT_TO_DOUBLE(w, wx);
    711 #ifdef Py_NAN
    712     if (wx == 0.0) {
    713         PyErr_SetString(PyExc_ZeroDivisionError,
    714                         "float modulo");
    715         return NULL;
    716     }
    717 #endif
    718     PyFPE_START_PROTECT("modulo", return 0)
    719     mod = fmod(vx, wx);
    720     if (mod) {
    721         /* ensure the remainder has the same sign as the denominator */
    722         if ((wx < 0) != (mod < 0)) {
    723             mod += wx;
    724         }
    725     }
    726     else {
    727         /* the remainder is zero, and in the presence of signed zeroes
    728            fmod returns different results across platforms; ensure
    729            it has the same sign as the denominator; we'd like to do
    730            "mod = wx * 0.0", but that may get optimized away */
    731         mod *= mod;  /* hide "mod = +0" from optimizer */
    732         if (wx < 0.0)
    733             mod = -mod;
    734     }
    735     PyFPE_END_PROTECT(mod)
    736     return PyFloat_FromDouble(mod);
    737 }
    738 
    739 static PyObject *
    740 float_divmod(PyObject *v, PyObject *w)
    741 {
    742     double vx, wx;
    743     double div, mod, floordiv;
    744     CONVERT_TO_DOUBLE(v, vx);
    745     CONVERT_TO_DOUBLE(w, wx);
    746     if (wx == 0.0) {
    747         PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
    748         return NULL;
    749     }
    750     PyFPE_START_PROTECT("divmod", return 0)
    751     mod = fmod(vx, wx);
    752     /* fmod is typically exact, so vx-mod is *mathematically* an
    753        exact multiple of wx.  But this is fp arithmetic, and fp
    754        vx - mod is an approximation; the result is that div may
    755        not be an exact integral value after the division, although
    756        it will always be very close to one.
    757     */
    758     div = (vx - mod) / wx;
    759     if (mod) {
    760         /* ensure the remainder has the same sign as the denominator */
    761         if ((wx < 0) != (mod < 0)) {
    762             mod += wx;
    763             div -= 1.0;
    764         }
    765     }
    766     else {
    767         /* the remainder is zero, and in the presence of signed zeroes
    768            fmod returns different results across platforms; ensure
    769            it has the same sign as the denominator; we'd like to do
    770            "mod = wx * 0.0", but that may get optimized away */
    771         mod *= mod;  /* hide "mod = +0" from optimizer */
    772         if (wx < 0.0)
    773             mod = -mod;
    774     }
    775     /* snap quotient to nearest integral value */
    776     if (div) {
    777         floordiv = floor(div);
    778         if (div - floordiv > 0.5)
    779             floordiv += 1.0;
    780     }
    781     else {
    782         /* div is zero - get the same sign as the true quotient */
    783         div *= div;             /* hide "div = +0" from optimizers */
    784         floordiv = div * vx / wx; /* zero w/ sign of vx/wx */
    785     }
    786     PyFPE_END_PROTECT(floordiv)
    787     return Py_BuildValue("(dd)", floordiv, mod);
    788 }
    789 
    790 static PyObject *
    791 float_floor_div(PyObject *v, PyObject *w)
    792 {
    793     PyObject *t, *r;
    794 
    795     t = float_divmod(v, w);
    796     if (t == NULL || t == Py_NotImplemented)
    797         return t;
    798     assert(PyTuple_CheckExact(t));
    799     r = PyTuple_GET_ITEM(t, 0);
    800     Py_INCREF(r);
    801     Py_DECREF(t);
    802     return r;
    803 }
    804 
    805 /* determine whether x is an odd integer or not;  assumes that
    806    x is not an infinity or nan. */
    807 #define DOUBLE_IS_ODD_INTEGER(x) (fmod(fabs(x), 2.0) == 1.0)
    808 
    809 static PyObject *
    810 float_pow(PyObject *v, PyObject *w, PyObject *z)
    811 {
    812     double iv, iw, ix;
    813     int negate_result = 0;
    814 
    815     if ((PyObject *)z != Py_None) {
    816         PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not "
    817             "allowed unless all arguments are integers");
    818         return NULL;
    819     }
    820 
    821     CONVERT_TO_DOUBLE(v, iv);
    822     CONVERT_TO_DOUBLE(w, iw);
    823 
    824     /* Sort out special cases here instead of relying on pow() */
    825     if (iw == 0) {              /* v**0 is 1, even 0**0 */
    826         return PyFloat_FromDouble(1.0);
    827     }
    828     if (Py_IS_NAN(iv)) {        /* nan**w = nan, unless w == 0 */
    829         return PyFloat_FromDouble(iv);
    830     }
    831     if (Py_IS_NAN(iw)) {        /* v**nan = nan, unless v == 1; 1**nan = 1 */
    832         return PyFloat_FromDouble(iv == 1.0 ? 1.0 : iw);
    833     }
    834     if (Py_IS_INFINITY(iw)) {
    835         /* v**inf is: 0.0 if abs(v) < 1; 1.0 if abs(v) == 1; inf if
    836          *     abs(v) > 1 (including case where v infinite)
    837          *
    838          * v**-inf is: inf if abs(v) < 1; 1.0 if abs(v) == 1; 0.0 if
    839          *     abs(v) > 1 (including case where v infinite)
    840          */
    841         iv = fabs(iv);
    842         if (iv == 1.0)
    843             return PyFloat_FromDouble(1.0);
    844         else if ((iw > 0.0) == (iv > 1.0))
    845             return PyFloat_FromDouble(fabs(iw)); /* return inf */
    846         else
    847             return PyFloat_FromDouble(0.0);
    848     }
    849     if (Py_IS_INFINITY(iv)) {
    850         /* (+-inf)**w is: inf for w positive, 0 for w negative; in
    851          *     both cases, we need to add the appropriate sign if w is
    852          *     an odd integer.
    853          */
    854         int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
    855         if (iw > 0.0)
    856             return PyFloat_FromDouble(iw_is_odd ? iv : fabs(iv));
    857         else
    858             return PyFloat_FromDouble(iw_is_odd ?
    859                                       copysign(0.0, iv) : 0.0);
    860     }
    861     if (iv == 0.0) {  /* 0**w is: 0 for w positive, 1 for w zero
    862                          (already dealt with above), and an error
    863                          if w is negative. */
    864         int iw_is_odd = DOUBLE_IS_ODD_INTEGER(iw);
    865         if (iw < 0.0) {
    866             PyErr_SetString(PyExc_ZeroDivisionError,
    867                             "0.0 cannot be raised to a "
    868                             "negative power");
    869             return NULL;
    870         }
    871         /* use correct sign if iw is odd */
    872         return PyFloat_FromDouble(iw_is_odd ? iv : 0.0);
    873     }
    874 
    875     if (iv < 0.0) {
    876         /* Whether this is an error is a mess, and bumps into libm
    877          * bugs so we have to figure it out ourselves.
    878          */
    879         if (iw != floor(iw)) {
    880             PyErr_SetString(PyExc_ValueError, "negative number "
    881                 "cannot be raised to a fractional power");
    882             return NULL;
    883         }
    884         /* iw is an exact integer, albeit perhaps a very large
    885          * one.  Replace iv by its absolute value and remember
    886          * to negate the pow result if iw is odd.
    887          */
    888         iv = -iv;
    889         negate_result = DOUBLE_IS_ODD_INTEGER(iw);
    890     }
    891 
    892     if (iv == 1.0) { /* 1**w is 1, even 1**inf and 1**nan */
    893         /* (-1) ** large_integer also ends up here.  Here's an
    894          * extract from the comments for the previous
    895          * implementation explaining why this special case is
    896          * necessary:
    897          *
    898          * -1 raised to an exact integer should never be exceptional.
    899          * Alas, some libms (chiefly glibc as of early 2003) return
    900          * NaN and set EDOM on pow(-1, large_int) if the int doesn't
    901          * happen to be representable in a *C* integer.  That's a
    902          * bug.
    903          */
    904         return PyFloat_FromDouble(negate_result ? -1.0 : 1.0);
    905     }
    906 
    907     /* Now iv and iw are finite, iw is nonzero, and iv is
    908      * positive and not equal to 1.0.  We finally allow
    909      * the platform pow to step in and do the rest.
    910      */
    911     errno = 0;
    912     PyFPE_START_PROTECT("pow", return NULL)
    913     ix = pow(iv, iw);
    914     PyFPE_END_PROTECT(ix)
    915     Py_ADJUST_ERANGE1(ix);
    916     if (negate_result)
    917         ix = -ix;
    918 
    919     if (errno != 0) {
    920         /* We don't expect any errno value other than ERANGE, but
    921          * the range of libm bugs appears unbounded.
    922          */
    923         PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
    924                              PyExc_ValueError);
    925         return NULL;
    926     }
    927     return PyFloat_FromDouble(ix);
    928 }
    929 
    930 #undef DOUBLE_IS_ODD_INTEGER
    931 
    932 static PyObject *
    933 float_neg(PyFloatObject *v)
    934 {
    935     return PyFloat_FromDouble(-v->ob_fval);
    936 }
    937 
    938 static PyObject *
    939 float_abs(PyFloatObject *v)
    940 {
    941     return PyFloat_FromDouble(fabs(v->ob_fval));
    942 }
    943 
    944 static int
    945 float_nonzero(PyFloatObject *v)
    946 {
    947     return v->ob_fval != 0.0;
    948 }
    949 
    950 static int
    951 float_coerce(PyObject **pv, PyObject **pw)
    952 {
    953     if (PyInt_Check(*pw)) {
    954         long x = PyInt_AsLong(*pw);
    955         *pw = PyFloat_FromDouble((double)x);
    956         Py_INCREF(*pv);
    957         return 0;
    958     }
    959     else if (PyLong_Check(*pw)) {
    960         double x = PyLong_AsDouble(*pw);
    961         if (x == -1.0 && PyErr_Occurred())
    962             return -1;
    963         *pw = PyFloat_FromDouble(x);
    964         Py_INCREF(*pv);
    965         return 0;
    966     }
    967     else if (PyFloat_Check(*pw)) {
    968         Py_INCREF(*pv);
    969         Py_INCREF(*pw);
    970         return 0;
    971     }
    972     return 1; /* Can't do it */
    973 }
    974 
    975 static PyObject *
    976 float_is_integer(PyObject *v)
    977 {
    978     double x = PyFloat_AsDouble(v);
    979     PyObject *o;
    980 
    981     if (x == -1.0 && PyErr_Occurred())
    982         return NULL;
    983     if (!Py_IS_FINITE(x))
    984         Py_RETURN_FALSE;
    985     errno = 0;
    986     PyFPE_START_PROTECT("is_integer", return NULL)
    987     o = (floor(x) == x) ? Py_True : Py_False;
    988     PyFPE_END_PROTECT(x)
    989     if (errno != 0) {
    990         PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
    991                              PyExc_ValueError);
    992         return NULL;
    993     }
    994     Py_INCREF(o);
    995     return o;
    996 }
    997 
    998 #if 0
    999 static PyObject *
   1000 float_is_inf(PyObject *v)
   1001 {
   1002     double x = PyFloat_AsDouble(v);
   1003     if (x == -1.0 && PyErr_Occurred())
   1004         return NULL;
   1005     return PyBool_FromLong((long)Py_IS_INFINITY(x));
   1006 }
   1007 
   1008 static PyObject *
   1009 float_is_nan(PyObject *v)
   1010 {
   1011     double x = PyFloat_AsDouble(v);
   1012     if (x == -1.0 && PyErr_Occurred())
   1013         return NULL;
   1014     return PyBool_FromLong((long)Py_IS_NAN(x));
   1015 }
   1016 
   1017 static PyObject *
   1018 float_is_finite(PyObject *v)
   1019 {
   1020     double x = PyFloat_AsDouble(v);
   1021     if (x == -1.0 && PyErr_Occurred())
   1022         return NULL;
   1023     return PyBool_FromLong((long)Py_IS_FINITE(x));
   1024 }
   1025 #endif
   1026 
   1027 static PyObject *
   1028 float_trunc(PyObject *v)
   1029 {
   1030     double x = PyFloat_AsDouble(v);
   1031     double wholepart;           /* integral portion of x, rounded toward 0 */
   1032 
   1033     (void)modf(x, &wholepart);
   1034     /* Try to get out cheap if this fits in a Python int.  The attempt
   1035      * to cast to long must be protected, as C doesn't define what
   1036      * happens if the double is too big to fit in a long.  Some rare
   1037      * systems raise an exception then (RISCOS was mentioned as one,
   1038      * and someone using a non-default option on Sun also bumped into
   1039      * that).  Note that checking for <= LONG_MAX is unsafe: if a long
   1040      * has more bits of precision than a double, casting LONG_MAX to
   1041      * double may yield an approximation, and if that's rounded up,
   1042      * then, e.g., wholepart=LONG_MAX+1 would yield true from the C
   1043      * expression wholepart<=LONG_MAX, despite that wholepart is
   1044      * actually greater than LONG_MAX.  However, assuming a two's complement
   1045      * machine with no trap representation, LONG_MIN will be a power of 2 (and
   1046      * hence exactly representable as a double), and LONG_MAX = -1-LONG_MIN, so
   1047      * the comparisons with (double)LONG_MIN below should be safe.
   1048      */
   1049     if ((double)LONG_MIN <= wholepart && wholepart < -(double)LONG_MIN) {
   1050         const long aslong = (long)wholepart;
   1051         return PyInt_FromLong(aslong);
   1052     }
   1053     return PyLong_FromDouble(wholepart);
   1054 }
   1055 
   1056 static PyObject *
   1057 float_long(PyObject *v)
   1058 {
   1059     double x = PyFloat_AsDouble(v);
   1060     return PyLong_FromDouble(x);
   1061 }
   1062 
   1063 /* _Py_double_round: rounds a finite nonzero double to the closest multiple of
   1064    10**-ndigits; here ndigits is within reasonable bounds (typically, -308 <=
   1065    ndigits <= 323).  Returns a Python float, or sets a Python error and
   1066    returns NULL on failure (OverflowError and memory errors are possible). */
   1067 
   1068 #ifndef PY_NO_SHORT_FLOAT_REPR
   1069 /* version of _Py_double_round that uses the correctly-rounded string<->double
   1070    conversions from Python/dtoa.c */
   1071 
   1072 /* FIVE_POW_LIMIT is the largest k such that 5**k is exactly representable as
   1073    a double.  Since we're using the code in Python/dtoa.c, it should be safe
   1074    to assume that C doubles are IEEE 754 binary64 format.  To be on the safe
   1075    side, we check this. */
   1076 #if DBL_MANT_DIG == 53
   1077 #define FIVE_POW_LIMIT 22
   1078 #else
   1079 #error "C doubles do not appear to be IEEE 754 binary64 format"
   1080 #endif
   1081 
   1082 PyObject *
   1083 _Py_double_round(double x, int ndigits) {
   1084 
   1085     double rounded, m;
   1086     Py_ssize_t buflen, mybuflen=100;
   1087     char *buf, *buf_end, shortbuf[100], *mybuf=shortbuf;
   1088     int decpt, sign, val, halfway_case;
   1089     PyObject *result = NULL;
   1090     _Py_SET_53BIT_PRECISION_HEADER;
   1091 
   1092     /* Easy path for the common case ndigits == 0. */
   1093     if (ndigits == 0) {
   1094         rounded = round(x);
   1095         if (fabs(rounded - x) == 0.5)
   1096             /* halfway between two integers; use round-away-from-zero */
   1097             rounded = x + (x > 0.0 ? 0.5 : -0.5);
   1098         return PyFloat_FromDouble(rounded);
   1099     }
   1100 
   1101     /* The basic idea is very simple: convert and round the double to a
   1102        decimal string using _Py_dg_dtoa, then convert that decimal string
   1103        back to a double with _Py_dg_strtod.  There's one minor difficulty:
   1104        Python 2.x expects round to do round-half-away-from-zero, while
   1105        _Py_dg_dtoa does round-half-to-even.  So we need some way to detect
   1106        and correct the halfway cases.
   1107 
   1108        Detection: a halfway value has the form k * 0.5 * 10**-ndigits for
   1109        some odd integer k.  Or in other words, a rational number x is
   1110        exactly halfway between two multiples of 10**-ndigits if its
   1111        2-valuation is exactly -ndigits-1 and its 5-valuation is at least
   1112        -ndigits.  For ndigits >= 0 the latter condition is automatically
   1113        satisfied for a binary float x, since any such float has
   1114        nonnegative 5-valuation.  For 0 > ndigits >= -22, x needs to be an
   1115        integral multiple of 5**-ndigits; we can check this using fmod.
   1116        For -22 > ndigits, there are no halfway cases: 5**23 takes 54 bits
   1117        to represent exactly, so any odd multiple of 0.5 * 10**n for n >=
   1118        23 takes at least 54 bits of precision to represent exactly.
   1119 
   1120        Correction: a simple strategy for dealing with halfway cases is to
   1121        (for the halfway cases only) call _Py_dg_dtoa with an argument of
   1122        ndigits+1 instead of ndigits (thus doing an exact conversion to
   1123        decimal), round the resulting string manually, and then convert
   1124        back using _Py_dg_strtod.
   1125     */
   1126 
   1127     /* nans, infinities and zeros should have already been dealt
   1128        with by the caller (in this case, builtin_round) */
   1129     assert(Py_IS_FINITE(x) && x != 0.0);
   1130 
   1131     /* find 2-valuation val of x */
   1132     m = frexp(x, &val);
   1133     while (m != floor(m)) {
   1134         m *= 2.0;
   1135         val--;
   1136     }
   1137 
   1138     /* determine whether this is a halfway case */
   1139     if (val == -ndigits-1) {
   1140         if (ndigits >= 0)
   1141             halfway_case = 1;
   1142         else if (ndigits >= -FIVE_POW_LIMIT) {
   1143             double five_pow = 1.0;
   1144             int i;
   1145             for (i=0; i < -ndigits; i++)
   1146                 five_pow *= 5.0;
   1147             halfway_case = fmod(x, five_pow) == 0.0;
   1148         }
   1149         else
   1150             halfway_case = 0;
   1151     }
   1152     else
   1153         halfway_case = 0;
   1154 
   1155     /* round to a decimal string; use an extra place for halfway case */
   1156     _Py_SET_53BIT_PRECISION_START;
   1157     buf = _Py_dg_dtoa(x, 3, ndigits+halfway_case, &decpt, &sign, &buf_end);
   1158     _Py_SET_53BIT_PRECISION_END;
   1159     if (buf == NULL) {
   1160         PyErr_NoMemory();
   1161         return NULL;
   1162     }
   1163     buflen = buf_end - buf;
   1164 
   1165     /* in halfway case, do the round-half-away-from-zero manually */
   1166     if (halfway_case) {
   1167         int i, carry;
   1168         /* sanity check: _Py_dg_dtoa should not have stripped
   1169            any zeros from the result: there should be exactly
   1170            ndigits+1 places following the decimal point, and
   1171            the last digit in the buffer should be a '5'.*/
   1172         assert(buflen - decpt == ndigits+1);
   1173         assert(buf[buflen-1] == '5');
   1174 
   1175         /* increment and shift right at the same time. */
   1176         decpt += 1;
   1177         carry = 1;
   1178         for (i=buflen-1; i-- > 0;) {
   1179             carry += buf[i] - '0';
   1180             buf[i+1] = carry % 10 + '0';
   1181             carry /= 10;
   1182         }
   1183         buf[0] = carry + '0';
   1184     }
   1185 
   1186     /* Get new buffer if shortbuf is too small.  Space needed <= buf_end -
   1187        buf + 8: (1 extra for '0', 1 for sign, 5 for exp, 1 for '\0'). */
   1188     if (buflen + 8 > mybuflen) {
   1189         mybuflen = buflen+8;
   1190         mybuf = (char *)PyMem_Malloc(mybuflen);
   1191         if (mybuf == NULL) {
   1192             PyErr_NoMemory();
   1193             goto exit;
   1194         }
   1195     }
   1196     /* copy buf to mybuf, adding exponent, sign and leading 0 */
   1197     PyOS_snprintf(mybuf, mybuflen, "%s0%se%d", (sign ? "-" : ""),
   1198                   buf, decpt - (int)buflen);
   1199 
   1200     /* and convert the resulting string back to a double */
   1201     errno = 0;
   1202     _Py_SET_53BIT_PRECISION_START;
   1203     rounded = _Py_dg_strtod(mybuf, NULL);
   1204     _Py_SET_53BIT_PRECISION_END;
   1205     if (errno == ERANGE && fabs(rounded) >= 1.)
   1206         PyErr_SetString(PyExc_OverflowError,
   1207                         "rounded value too large to represent");
   1208     else
   1209         result = PyFloat_FromDouble(rounded);
   1210 
   1211     /* done computing value;  now clean up */
   1212     if (mybuf != shortbuf)
   1213         PyMem_Free(mybuf);
   1214   exit:
   1215     _Py_dg_freedtoa(buf);
   1216     return result;
   1217 }
   1218 
   1219 #undef FIVE_POW_LIMIT
   1220 
   1221 #else /* PY_NO_SHORT_FLOAT_REPR */
   1222 
   1223 /* fallback version, to be used when correctly rounded binary<->decimal
   1224    conversions aren't available */
   1225 
   1226 PyObject *
   1227 _Py_double_round(double x, int ndigits) {
   1228     double pow1, pow2, y, z;
   1229     if (ndigits >= 0) {
   1230         if (ndigits > 22) {
   1231             /* pow1 and pow2 are each safe from overflow, but
   1232                pow1*pow2 ~= pow(10.0, ndigits) might overflow */
   1233             pow1 = pow(10.0, (double)(ndigits-22));
   1234             pow2 = 1e22;
   1235         }
   1236         else {
   1237             pow1 = pow(10.0, (double)ndigits);
   1238             pow2 = 1.0;
   1239         }
   1240         y = (x*pow1)*pow2;
   1241         /* if y overflows, then rounded value is exactly x */
   1242         if (!Py_IS_FINITE(y))
   1243             return PyFloat_FromDouble(x);
   1244     }
   1245     else {
   1246         pow1 = pow(10.0, (double)-ndigits);
   1247         pow2 = 1.0; /* unused; silences a gcc compiler warning */
   1248         y = x / pow1;
   1249     }
   1250 
   1251     z = round(y);
   1252     if (fabs(y-z) == 0.5)
   1253         /* halfway between two integers; use round-away-from-zero */
   1254         z = y + copysign(0.5, y);
   1255 
   1256     if (ndigits >= 0)
   1257         z = (z / pow2) / pow1;
   1258     else
   1259         z *= pow1;
   1260 
   1261     /* if computation resulted in overflow, raise OverflowError */
   1262     if (!Py_IS_FINITE(z)) {
   1263         PyErr_SetString(PyExc_OverflowError,
   1264                         "overflow occurred during round");
   1265         return NULL;
   1266     }
   1267 
   1268     return PyFloat_FromDouble(z);
   1269 }
   1270 
   1271 #endif /* PY_NO_SHORT_FLOAT_REPR */
   1272 
   1273 static PyObject *
   1274 float_float(PyObject *v)
   1275 {
   1276     if (PyFloat_CheckExact(v))
   1277         Py_INCREF(v);
   1278     else
   1279         v = PyFloat_FromDouble(((PyFloatObject *)v)->ob_fval);
   1280     return v;
   1281 }
   1282 
   1283 /* turn ASCII hex characters into integer values and vice versa */
   1284 
   1285 static char
   1286 char_from_hex(int x)
   1287 {
   1288     assert(0 <= x && x < 16);
   1289     return "0123456789abcdef"[x];
   1290 }
   1291 
   1292 static int
   1293 hex_from_char(char c) {
   1294     int x;
   1295     switch(c) {
   1296     case '0':
   1297         x = 0;
   1298         break;
   1299     case '1':
   1300         x = 1;
   1301         break;
   1302     case '2':
   1303         x = 2;
   1304         break;
   1305     case '3':
   1306         x = 3;
   1307         break;
   1308     case '4':
   1309         x = 4;
   1310         break;
   1311     case '5':
   1312         x = 5;
   1313         break;
   1314     case '6':
   1315         x = 6;
   1316         break;
   1317     case '7':
   1318         x = 7;
   1319         break;
   1320     case '8':
   1321         x = 8;
   1322         break;
   1323     case '9':
   1324         x = 9;
   1325         break;
   1326     case 'a':
   1327     case 'A':
   1328         x = 10;
   1329         break;
   1330     case 'b':
   1331     case 'B':
   1332         x = 11;
   1333         break;
   1334     case 'c':
   1335     case 'C':
   1336         x = 12;
   1337         break;
   1338     case 'd':
   1339     case 'D':
   1340         x = 13;
   1341         break;
   1342     case 'e':
   1343     case 'E':
   1344         x = 14;
   1345         break;
   1346     case 'f':
   1347     case 'F':
   1348         x = 15;
   1349         break;
   1350     default:
   1351         x = -1;
   1352         break;
   1353     }
   1354     return x;
   1355 }
   1356 
   1357 /* convert a float to a hexadecimal string */
   1358 
   1359 /* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer
   1360    of the form 4k+1. */
   1361 #define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4
   1362 
   1363 static PyObject *
   1364 float_hex(PyObject *v)
   1365 {
   1366     double x, m;
   1367     int e, shift, i, si, esign;
   1368     /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the
   1369        trailing NUL byte. */
   1370     char s[(TOHEX_NBITS-1)/4+3];
   1371 
   1372     CONVERT_TO_DOUBLE(v, x);
   1373 
   1374     if (Py_IS_NAN(x) || Py_IS_INFINITY(x))
   1375         return float_str((PyFloatObject *)v);
   1376 
   1377     if (x == 0.0) {
   1378         if (copysign(1.0, x) == -1.0)
   1379             return PyString_FromString("-0x0.0p+0");
   1380         else
   1381             return PyString_FromString("0x0.0p+0");
   1382     }
   1383 
   1384     m = frexp(fabs(x), &e);
   1385     shift = 1 - MAX(DBL_MIN_EXP - e, 0);
   1386     m = ldexp(m, shift);
   1387     e -= shift;
   1388 
   1389     si = 0;
   1390     s[si] = char_from_hex((int)m);
   1391     si++;
   1392     m -= (int)m;
   1393     s[si] = '.';
   1394     si++;
   1395     for (i=0; i < (TOHEX_NBITS-1)/4; i++) {
   1396         m *= 16.0;
   1397         s[si] = char_from_hex((int)m);
   1398         si++;
   1399         m -= (int)m;
   1400     }
   1401     s[si] = '\0';
   1402 
   1403     if (e < 0) {
   1404         esign = (int)'-';
   1405         e = -e;
   1406     }
   1407     else
   1408         esign = (int)'+';
   1409 
   1410     if (x < 0.0)
   1411         return PyString_FromFormat("-0x%sp%c%d", s, esign, e);
   1412     else
   1413         return PyString_FromFormat("0x%sp%c%d", s, esign, e);
   1414 }
   1415 
   1416 PyDoc_STRVAR(float_hex_doc,
   1417 "float.hex() -> string\n\
   1418 \n\
   1419 Return a hexadecimal representation of a floating-point number.\n\
   1420 >>> (-0.1).hex()\n\
   1421 '-0x1.999999999999ap-4'\n\
   1422 >>> 3.14159.hex()\n\
   1423 '0x1.921f9f01b866ep+1'");
   1424 
   1425 /* Case-insensitive locale-independent string match used for nan and inf
   1426    detection. t should be lower-case and null-terminated.  Return a nonzero
   1427    result if the first strlen(t) characters of s match t and 0 otherwise. */
   1428 
   1429 static int
   1430 case_insensitive_match(const char *s, const char *t)
   1431 {
   1432     while(*t && Py_TOLOWER(*s) == *t) {
   1433         s++;
   1434         t++;
   1435     }
   1436     return *t ? 0 : 1;
   1437 }
   1438 
   1439 /* Convert a hexadecimal string to a float. */
   1440 
   1441 static PyObject *
   1442 float_fromhex(PyObject *cls, PyObject *arg)
   1443 {
   1444     PyObject *result_as_float, *result;
   1445     double x;
   1446     long exp, top_exp, lsb, key_digit;
   1447     char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end;
   1448     int half_eps, digit, round_up, sign=1;
   1449     Py_ssize_t length, ndigits, fdigits, i;
   1450 
   1451     /*
   1452      * For the sake of simplicity and correctness, we impose an artificial
   1453      * limit on ndigits, the total number of hex digits in the coefficient
   1454      * The limit is chosen to ensure that, writing exp for the exponent,
   1455      *
   1456      *   (1) if exp > LONG_MAX/2 then the value of the hex string is
   1457      *   guaranteed to overflow (provided it's nonzero)
   1458      *
   1459      *   (2) if exp < LONG_MIN/2 then the value of the hex string is
   1460      *   guaranteed to underflow to 0.
   1461      *
   1462      *   (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of
   1463      *   overflow in the calculation of exp and top_exp below.
   1464      *
   1465      * More specifically, ndigits is assumed to satisfy the following
   1466      * inequalities:
   1467      *
   1468      *   4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2
   1469      *   4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP
   1470      *
   1471      * If either of these inequalities is not satisfied, a ValueError is
   1472      * raised.  Otherwise, write x for the value of the hex string, and
   1473      * assume x is nonzero.  Then
   1474      *
   1475      *   2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits).
   1476      *
   1477      * Now if exp > LONG_MAX/2 then:
   1478      *
   1479      *   exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP)
   1480      *                    = DBL_MAX_EXP
   1481      *
   1482      * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C
   1483      * double, so overflows.  If exp < LONG_MIN/2, then
   1484      *
   1485      *   exp + 4*ndigits <= LONG_MIN/2 - 1 + (
   1486      *                      DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2)
   1487      *                    = DBL_MIN_EXP - DBL_MANT_DIG - 1
   1488      *
   1489      * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0
   1490      * when converted to a C double.
   1491      *
   1492      * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both
   1493      * exp+4*ndigits and exp-4*ndigits are within the range of a long.
   1494      */
   1495 
   1496     if (PyString_AsStringAndSize(arg, &s, &length))
   1497         return NULL;
   1498     s_end = s + length;
   1499 
   1500     /********************
   1501      * Parse the string *
   1502      ********************/
   1503 
   1504     /* leading whitespace and optional sign */
   1505     while (Py_ISSPACE(*s))
   1506         s++;
   1507     if (*s == '-') {
   1508         s++;
   1509         sign = -1;
   1510     }
   1511     else if (*s == '+')
   1512         s++;
   1513 
   1514     /* infinities and nans */
   1515     if (*s == 'i' || *s == 'I') {
   1516         if (!case_insensitive_match(s+1, "nf"))
   1517             goto parse_error;
   1518         s += 3;
   1519         x = Py_HUGE_VAL;
   1520         if (case_insensitive_match(s, "inity"))
   1521             s += 5;
   1522         goto finished;
   1523     }
   1524     if (*s == 'n' || *s == 'N') {
   1525         if (!case_insensitive_match(s+1, "an"))
   1526             goto parse_error;
   1527         s += 3;
   1528         x = Py_NAN;
   1529         goto finished;
   1530     }
   1531 
   1532     /* [0x] */
   1533     s_store = s;
   1534     if (*s == '0') {
   1535         s++;
   1536         if (*s == 'x' || *s == 'X')
   1537             s++;
   1538         else
   1539             s = s_store;
   1540     }
   1541 
   1542     /* coefficient: <integer> [. <fraction>] */
   1543     coeff_start = s;
   1544     while (hex_from_char(*s) >= 0)
   1545         s++;
   1546     s_store = s;
   1547     if (*s == '.') {
   1548         s++;
   1549         while (hex_from_char(*s) >= 0)
   1550             s++;
   1551         coeff_end = s-1;
   1552     }
   1553     else
   1554         coeff_end = s;
   1555 
   1556     /* ndigits = total # of hex digits; fdigits = # after point */
   1557     ndigits = coeff_end - coeff_start;
   1558     fdigits = coeff_end - s_store;
   1559     if (ndigits == 0)
   1560         goto parse_error;
   1561     if (ndigits > MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
   1562                       LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
   1563         goto insane_length_error;
   1564 
   1565     /* [p <exponent>] */
   1566     if (*s == 'p' || *s == 'P') {
   1567         s++;
   1568         exp_start = s;
   1569         if (*s == '-' || *s == '+')
   1570             s++;
   1571         if (!('0' <= *s && *s <= '9'))
   1572             goto parse_error;
   1573         s++;
   1574         while ('0' <= *s && *s <= '9')
   1575             s++;
   1576         exp = strtol(exp_start, NULL, 10);
   1577     }
   1578     else
   1579         exp = 0;
   1580 
   1581 /* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */
   1582 #define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ?            \
   1583                      coeff_end-(j) :                                    \
   1584                      coeff_end-1-(j)))
   1585 
   1586     /*******************************************
   1587      * Compute rounded value of the hex string *
   1588      *******************************************/
   1589 
   1590     /* Discard leading zeros, and catch extreme overflow and underflow */
   1591     while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0)
   1592         ndigits--;
   1593     if (ndigits == 0 || exp < LONG_MIN/2) {
   1594         x = 0.0;
   1595         goto finished;
   1596     }
   1597     if (exp > LONG_MAX/2)
   1598         goto overflow_error;
   1599 
   1600     /* Adjust exponent for fractional part. */
   1601     exp = exp - 4*((long)fdigits);
   1602 
   1603     /* top_exp = 1 more than exponent of most sig. bit of coefficient */
   1604     top_exp = exp + 4*((long)ndigits - 1);
   1605     for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2)
   1606         top_exp++;
   1607 
   1608     /* catch almost all nonextreme cases of overflow and underflow here */
   1609     if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) {
   1610         x = 0.0;
   1611         goto finished;
   1612     }
   1613     if (top_exp > DBL_MAX_EXP)
   1614         goto overflow_error;
   1615 
   1616     /* lsb = exponent of least significant bit of the *rounded* value.
   1617        This is top_exp - DBL_MANT_DIG unless result is subnormal. */
   1618     lsb = MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
   1619 
   1620     x = 0.0;
   1621     if (exp >= lsb) {
   1622         /* no rounding required */
   1623         for (i = ndigits-1; i >= 0; i--)
   1624             x = 16.0*x + HEX_DIGIT(i);
   1625         x = ldexp(x, (int)(exp));
   1626         goto finished;
   1627     }
   1628     /* rounding required.  key_digit is the index of the hex digit
   1629        containing the first bit to be rounded away. */
   1630     half_eps = 1 << (int)((lsb - exp - 1) % 4);
   1631     key_digit = (lsb - exp - 1) / 4;
   1632     for (i = ndigits-1; i > key_digit; i--)
   1633         x = 16.0*x + HEX_DIGIT(i);
   1634     digit = HEX_DIGIT(key_digit);
   1635     x = 16.0*x + (double)(digit & (16-2*half_eps));
   1636 
   1637     /* round-half-even: round up if bit lsb-1 is 1 and at least one of
   1638        bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
   1639     if ((digit & half_eps) != 0) {
   1640         round_up = 0;
   1641         if ((digit & (3*half_eps-1)) != 0 ||
   1642             (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0))
   1643             round_up = 1;
   1644         else
   1645             for (i = key_digit-1; i >= 0; i--)
   1646                 if (HEX_DIGIT(i) != 0) {
   1647                     round_up = 1;
   1648                     break;
   1649                 }
   1650         if (round_up == 1) {
   1651             x += 2*half_eps;
   1652             if (top_exp == DBL_MAX_EXP &&
   1653                 x == ldexp((double)(2*half_eps), DBL_MANT_DIG))
   1654                 /* overflow corner case: pre-rounded value <
   1655                    2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */
   1656                 goto overflow_error;
   1657         }
   1658     }
   1659     x = ldexp(x, (int)(exp+4*key_digit));
   1660 
   1661   finished:
   1662     /* optional trailing whitespace leading to the end of the string */
   1663     while (Py_ISSPACE(*s))
   1664         s++;
   1665     if (s != s_end)
   1666         goto parse_error;
   1667     result_as_float = Py_BuildValue("(d)", sign * x);
   1668     if (result_as_float == NULL)
   1669         return NULL;
   1670     result = PyObject_CallObject(cls, result_as_float);
   1671     Py_DECREF(result_as_float);
   1672     return result;
   1673 
   1674   overflow_error:
   1675     PyErr_SetString(PyExc_OverflowError,
   1676                     "hexadecimal value too large to represent as a float");
   1677     return NULL;
   1678 
   1679   parse_error:
   1680     PyErr_SetString(PyExc_ValueError,
   1681                     "invalid hexadecimal floating-point string");
   1682     return NULL;
   1683 
   1684   insane_length_error:
   1685     PyErr_SetString(PyExc_ValueError,
   1686                     "hexadecimal string too long to convert");
   1687     return NULL;
   1688 }
   1689 
   1690 PyDoc_STRVAR(float_fromhex_doc,
   1691 "float.fromhex(string) -> float\n\
   1692 \n\
   1693 Create a floating-point number from a hexadecimal string.\n\
   1694 >>> float.fromhex('0x1.ffffp10')\n\
   1695 2047.984375\n\
   1696 >>> float.fromhex('-0x1p-1074')\n\
   1697 -4.9406564584124654e-324");
   1698 
   1699 
   1700 static PyObject *
   1701 float_as_integer_ratio(PyObject *v, PyObject *unused)
   1702 {
   1703     double self;
   1704     double float_part;
   1705     int exponent;
   1706     int i;
   1707 
   1708     PyObject *prev;
   1709     PyObject *py_exponent = NULL;
   1710     PyObject *numerator = NULL;
   1711     PyObject *denominator = NULL;
   1712     PyObject *result_pair = NULL;
   1713     PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
   1714 
   1715 #define INPLACE_UPDATE(obj, call) \
   1716     prev = obj; \
   1717     obj = call; \
   1718     Py_DECREF(prev); \
   1719 
   1720     CONVERT_TO_DOUBLE(v, self);
   1721 
   1722     if (Py_IS_INFINITY(self)) {
   1723       PyErr_SetString(PyExc_OverflowError,
   1724                       "Cannot pass infinity to float.as_integer_ratio.");
   1725       return NULL;
   1726     }
   1727 #ifdef Py_NAN
   1728     if (Py_IS_NAN(self)) {
   1729       PyErr_SetString(PyExc_ValueError,
   1730                       "Cannot pass NaN to float.as_integer_ratio.");
   1731       return NULL;
   1732     }
   1733 #endif
   1734 
   1735     PyFPE_START_PROTECT("as_integer_ratio", goto error);
   1736     float_part = frexp(self, &exponent);        /* self == float_part * 2**exponent exactly */
   1737     PyFPE_END_PROTECT(float_part);
   1738 
   1739     for (i=0; i<300 && float_part != floor(float_part) ; i++) {
   1740         float_part *= 2.0;
   1741         exponent--;
   1742     }
   1743     /* self == float_part * 2**exponent exactly and float_part is integral.
   1744        If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
   1745        to be truncated by PyLong_FromDouble(). */
   1746 
   1747     numerator = PyLong_FromDouble(float_part);
   1748     if (numerator == NULL) goto error;
   1749 
   1750     /* fold in 2**exponent */
   1751     denominator = PyLong_FromLong(1);
   1752     py_exponent = PyLong_FromLong(labs((long)exponent));
   1753     if (py_exponent == NULL) goto error;
   1754     INPLACE_UPDATE(py_exponent,
   1755                    long_methods->nb_lshift(denominator, py_exponent));
   1756     if (py_exponent == NULL) goto error;
   1757     if (exponent > 0) {
   1758         INPLACE_UPDATE(numerator,
   1759                        long_methods->nb_multiply(numerator, py_exponent));
   1760         if (numerator == NULL) goto error;
   1761     }
   1762     else {
   1763         Py_DECREF(denominator);
   1764         denominator = py_exponent;
   1765         py_exponent = NULL;
   1766     }
   1767 
   1768     /* Returns ints instead of longs where possible */
   1769     INPLACE_UPDATE(numerator, PyNumber_Int(numerator));
   1770     if (numerator == NULL) goto error;
   1771     INPLACE_UPDATE(denominator, PyNumber_Int(denominator));
   1772     if (denominator == NULL) goto error;
   1773 
   1774     result_pair = PyTuple_Pack(2, numerator, denominator);
   1775 
   1776 #undef INPLACE_UPDATE
   1777 error:
   1778     Py_XDECREF(py_exponent);
   1779     Py_XDECREF(denominator);
   1780     Py_XDECREF(numerator);
   1781     return result_pair;
   1782 }
   1783 
   1784 PyDoc_STRVAR(float_as_integer_ratio_doc,
   1785 "float.as_integer_ratio() -> (int, int)\n"
   1786 "\n"
   1787 "Return a pair of integers, whose ratio is exactly equal to the original\n"
   1788 "float and with a positive denominator.\n"
   1789 "Raise OverflowError on infinities and a ValueError on NaNs.\n"
   1790 "\n"
   1791 ">>> (10.0).as_integer_ratio()\n"
   1792 "(10, 1)\n"
   1793 ">>> (0.0).as_integer_ratio()\n"
   1794 "(0, 1)\n"
   1795 ">>> (-.25).as_integer_ratio()\n"
   1796 "(-1, 4)");
   1797 
   1798 
   1799 static PyObject *
   1800 float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
   1801 
   1802 static PyObject *
   1803 float_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   1804 {
   1805     PyObject *x = Py_False; /* Integer zero */
   1806     static char *kwlist[] = {"x", 0};
   1807 
   1808     if (type != &PyFloat_Type)
   1809         return float_subtype_new(type, args, kwds); /* Wimp out */
   1810     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x))
   1811         return NULL;
   1812     /* If it's a string, but not a string subclass, use
   1813        PyFloat_FromString. */
   1814     if (PyString_CheckExact(x))
   1815         return PyFloat_FromString(x, NULL);
   1816     return PyNumber_Float(x);
   1817 }
   1818 
   1819 /* Wimpy, slow approach to tp_new calls for subtypes of float:
   1820    first create a regular float from whatever arguments we got,
   1821    then allocate a subtype instance and initialize its ob_fval
   1822    from the regular float.  The regular float is then thrown away.
   1823 */
   1824 static PyObject *
   1825 float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   1826 {
   1827     PyObject *tmp, *newobj;
   1828 
   1829     assert(PyType_IsSubtype(type, &PyFloat_Type));
   1830     tmp = float_new(&PyFloat_Type, args, kwds);
   1831     if (tmp == NULL)
   1832         return NULL;
   1833     assert(PyFloat_CheckExact(tmp));
   1834     newobj = type->tp_alloc(type, 0);
   1835     if (newobj == NULL) {
   1836         Py_DECREF(tmp);
   1837         return NULL;
   1838     }
   1839     ((PyFloatObject *)newobj)->ob_fval = ((PyFloatObject *)tmp)->ob_fval;
   1840     Py_DECREF(tmp);
   1841     return newobj;
   1842 }
   1843 
   1844 static PyObject *
   1845 float_getnewargs(PyFloatObject *v)
   1846 {
   1847     return Py_BuildValue("(d)", v->ob_fval);
   1848 }
   1849 
   1850 /* this is for the benefit of the pack/unpack routines below */
   1851 
   1852 typedef enum {
   1853     unknown_format, ieee_big_endian_format, ieee_little_endian_format
   1854 } float_format_type;
   1855 
   1856 static float_format_type double_format, float_format;
   1857 static float_format_type detected_double_format, detected_float_format;
   1858 
   1859 static PyObject *
   1860 float_getformat(PyTypeObject *v, PyObject* arg)
   1861 {
   1862     char* s;
   1863     float_format_type r;
   1864 
   1865     if (!PyString_Check(arg)) {
   1866         PyErr_Format(PyExc_TypeError,
   1867          "__getformat__() argument must be string, not %.500s",
   1868                          Py_TYPE(arg)->tp_name);
   1869         return NULL;
   1870     }
   1871     s = PyString_AS_STRING(arg);
   1872     if (strcmp(s, "double") == 0) {
   1873         r = double_format;
   1874     }
   1875     else if (strcmp(s, "float") == 0) {
   1876         r = float_format;
   1877     }
   1878     else {
   1879         PyErr_SetString(PyExc_ValueError,
   1880                         "__getformat__() argument 1 must be "
   1881                         "'double' or 'float'");
   1882         return NULL;
   1883     }
   1884 
   1885     switch (r) {
   1886     case unknown_format:
   1887         return PyString_FromString("unknown");
   1888     case ieee_little_endian_format:
   1889         return PyString_FromString("IEEE, little-endian");
   1890     case ieee_big_endian_format:
   1891         return PyString_FromString("IEEE, big-endian");
   1892     default:
   1893         Py_FatalError("insane float_format or double_format");
   1894         return NULL;
   1895     }
   1896 }
   1897 
   1898 PyDoc_STRVAR(float_getformat_doc,
   1899 "float.__getformat__(typestr) -> string\n"
   1900 "\n"
   1901 "You probably don't want to use this function.  It exists mainly to be\n"
   1902 "used in Python's test suite.\n"
   1903 "\n"
   1904 "typestr must be 'double' or 'float'.  This function returns whichever of\n"
   1905 "'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n"
   1906 "format of floating point numbers used by the C type named by typestr.");
   1907 
   1908 static PyObject *
   1909 float_setformat(PyTypeObject *v, PyObject* args)
   1910 {
   1911     char* typestr;
   1912     char* format;
   1913     float_format_type f;
   1914     float_format_type detected;
   1915     float_format_type *p;
   1916 
   1917     if (!PyArg_ParseTuple(args, "ss:__setformat__", &typestr, &format))
   1918         return NULL;
   1919 
   1920     if (strcmp(typestr, "double") == 0) {
   1921         p = &double_format;
   1922         detected = detected_double_format;
   1923     }
   1924     else if (strcmp(typestr, "float") == 0) {
   1925         p = &float_format;
   1926         detected = detected_float_format;
   1927     }
   1928     else {
   1929         PyErr_SetString(PyExc_ValueError,
   1930                         "__setformat__() argument 1 must "
   1931                         "be 'double' or 'float'");
   1932         return NULL;
   1933     }
   1934 
   1935     if (strcmp(format, "unknown") == 0) {
   1936         f = unknown_format;
   1937     }
   1938     else if (strcmp(format, "IEEE, little-endian") == 0) {
   1939         f = ieee_little_endian_format;
   1940     }
   1941     else if (strcmp(format, "IEEE, big-endian") == 0) {
   1942         f = ieee_big_endian_format;
   1943     }
   1944     else {
   1945         PyErr_SetString(PyExc_ValueError,
   1946                         "__setformat__() argument 2 must be "
   1947                         "'unknown', 'IEEE, little-endian' or "
   1948                         "'IEEE, big-endian'");
   1949         return NULL;
   1950 
   1951     }
   1952 
   1953     if (f != unknown_format && f != detected) {
   1954         PyErr_Format(PyExc_ValueError,
   1955                      "can only set %s format to 'unknown' or the "
   1956                      "detected platform value", typestr);
   1957         return NULL;
   1958     }
   1959 
   1960     *p = f;
   1961     Py_RETURN_NONE;
   1962 }
   1963 
   1964 PyDoc_STRVAR(float_setformat_doc,
   1965 "float.__setformat__(typestr, fmt) -> None\n"
   1966 "\n"
   1967 "You probably don't want to use this function.  It exists mainly to be\n"
   1968 "used in Python's test suite.\n"
   1969 "\n"
   1970 "typestr must be 'double' or 'float'.  fmt must be one of 'unknown',\n"
   1971 "'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n"
   1972 "one of the latter two if it appears to match the underlying C reality.\n"
   1973 "\n"
   1974 "Override the automatic determination of C-level floating point type.\n"
   1975 "This affects how floats are converted to and from binary strings.");
   1976 
   1977 static PyObject *
   1978 float_getzero(PyObject *v, void *closure)
   1979 {
   1980     return PyFloat_FromDouble(0.0);
   1981 }
   1982 
   1983 static PyObject *
   1984 float__format__(PyObject *self, PyObject *args)
   1985 {
   1986     PyObject *format_spec;
   1987 
   1988     if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
   1989         return NULL;
   1990     if (PyBytes_Check(format_spec))
   1991         return _PyFloat_FormatAdvanced(self,
   1992                                        PyBytes_AS_STRING(format_spec),
   1993                                        PyBytes_GET_SIZE(format_spec));
   1994     if (PyUnicode_Check(format_spec)) {
   1995         /* Convert format_spec to a str */
   1996         PyObject *result;
   1997         PyObject *str_spec = PyObject_Str(format_spec);
   1998 
   1999         if (str_spec == NULL)
   2000             return NULL;
   2001 
   2002         result = _PyFloat_FormatAdvanced(self,
   2003                                          PyBytes_AS_STRING(str_spec),
   2004                                          PyBytes_GET_SIZE(str_spec));
   2005 
   2006         Py_DECREF(str_spec);
   2007         return result;
   2008     }
   2009     PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
   2010     return NULL;
   2011 }
   2012 
   2013 PyDoc_STRVAR(float__format__doc,
   2014 "float.__format__(format_spec) -> string\n"
   2015 "\n"
   2016 "Formats the float according to format_spec.");
   2017 
   2018 
   2019 static PyMethodDef float_methods[] = {
   2020     {"conjugate",       (PyCFunction)float_float,       METH_NOARGS,
   2021      "Return self, the complex conjugate of any float."},
   2022     {"__trunc__",       (PyCFunction)float_trunc, METH_NOARGS,
   2023      "Return the Integral closest to x between 0 and x."},
   2024     {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS,
   2025      float_as_integer_ratio_doc},
   2026     {"fromhex", (PyCFunction)float_fromhex,
   2027      METH_O|METH_CLASS, float_fromhex_doc},
   2028     {"hex", (PyCFunction)float_hex,
   2029      METH_NOARGS, float_hex_doc},
   2030     {"is_integer",      (PyCFunction)float_is_integer,  METH_NOARGS,
   2031      "Return True if the float is an integer."},
   2032 #if 0
   2033     {"is_inf",          (PyCFunction)float_is_inf,      METH_NOARGS,
   2034      "Return True if the float is positive or negative infinite."},
   2035     {"is_finite",       (PyCFunction)float_is_finite,   METH_NOARGS,
   2036      "Return True if the float is finite, neither infinite nor NaN."},
   2037     {"is_nan",          (PyCFunction)float_is_nan,      METH_NOARGS,
   2038      "Return True if the float is not a number (NaN)."},
   2039 #endif
   2040     {"__getnewargs__",          (PyCFunction)float_getnewargs,  METH_NOARGS},
   2041     {"__getformat__",           (PyCFunction)float_getformat,
   2042      METH_O|METH_CLASS,                 float_getformat_doc},
   2043     {"__setformat__",           (PyCFunction)float_setformat,
   2044      METH_VARARGS|METH_CLASS,           float_setformat_doc},
   2045     {"__format__",          (PyCFunction)float__format__,
   2046      METH_VARARGS,                  float__format__doc},
   2047     {NULL,              NULL}           /* sentinel */
   2048 };
   2049 
   2050 static PyGetSetDef float_getset[] = {
   2051     {"real",
   2052      (getter)float_float, (setter)NULL,
   2053      "the real part of a complex number",
   2054      NULL},
   2055     {"imag",
   2056      (getter)float_getzero, (setter)NULL,
   2057      "the imaginary part of a complex number",
   2058      NULL},
   2059     {NULL}  /* Sentinel */
   2060 };
   2061 
   2062 PyDoc_STRVAR(float_doc,
   2063 "float(x) -> floating point number\n\
   2064 \n\
   2065 Convert a string or number to a floating point number, if possible.");
   2066 
   2067 
   2068 static PyNumberMethods float_as_number = {
   2069     float_add,          /*nb_add*/
   2070     float_sub,          /*nb_subtract*/
   2071     float_mul,          /*nb_multiply*/
   2072     float_classic_div, /*nb_divide*/
   2073     float_rem,          /*nb_remainder*/
   2074     float_divmod,       /*nb_divmod*/
   2075     float_pow,          /*nb_power*/
   2076     (unaryfunc)float_neg, /*nb_negative*/
   2077     (unaryfunc)float_float, /*nb_positive*/
   2078     (unaryfunc)float_abs, /*nb_absolute*/
   2079     (inquiry)float_nonzero, /*nb_nonzero*/
   2080     0,                  /*nb_invert*/
   2081     0,                  /*nb_lshift*/
   2082     0,                  /*nb_rshift*/
   2083     0,                  /*nb_and*/
   2084     0,                  /*nb_xor*/
   2085     0,                  /*nb_or*/
   2086     float_coerce,       /*nb_coerce*/
   2087     float_trunc,        /*nb_int*/
   2088     float_long,         /*nb_long*/
   2089     float_float,        /*nb_float*/
   2090     0,                  /* nb_oct */
   2091     0,                  /* nb_hex */
   2092     0,                  /* nb_inplace_add */
   2093     0,                  /* nb_inplace_subtract */
   2094     0,                  /* nb_inplace_multiply */
   2095     0,                  /* nb_inplace_divide */
   2096     0,                  /* nb_inplace_remainder */
   2097     0,                  /* nb_inplace_power */
   2098     0,                  /* nb_inplace_lshift */
   2099     0,                  /* nb_inplace_rshift */
   2100     0,                  /* nb_inplace_and */
   2101     0,                  /* nb_inplace_xor */
   2102     0,                  /* nb_inplace_or */
   2103     float_floor_div, /* nb_floor_divide */
   2104     float_div,          /* nb_true_divide */
   2105     0,                  /* nb_inplace_floor_divide */
   2106     0,                  /* nb_inplace_true_divide */
   2107 };
   2108 
   2109 PyTypeObject PyFloat_Type = {
   2110     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   2111     "float",
   2112     sizeof(PyFloatObject),
   2113     0,
   2114     (destructor)float_dealloc,                  /* tp_dealloc */
   2115     (printfunc)float_print,                     /* tp_print */
   2116     0,                                          /* tp_getattr */
   2117     0,                                          /* tp_setattr */
   2118     0,                                          /* tp_compare */
   2119     (reprfunc)float_repr,                       /* tp_repr */
   2120     &float_as_number,                           /* tp_as_number */
   2121     0,                                          /* tp_as_sequence */
   2122     0,                                          /* tp_as_mapping */
   2123     (hashfunc)float_hash,                       /* tp_hash */
   2124     0,                                          /* tp_call */
   2125     (reprfunc)float_str,                        /* tp_str */
   2126     PyObject_GenericGetAttr,                    /* tp_getattro */
   2127     0,                                          /* tp_setattro */
   2128     0,                                          /* tp_as_buffer */
   2129     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
   2130         Py_TPFLAGS_BASETYPE,                    /* tp_flags */
   2131     float_doc,                                  /* tp_doc */
   2132     0,                                          /* tp_traverse */
   2133     0,                                          /* tp_clear */
   2134     float_richcompare,                          /* tp_richcompare */
   2135     0,                                          /* tp_weaklistoffset */
   2136     0,                                          /* tp_iter */
   2137     0,                                          /* tp_iternext */
   2138     float_methods,                              /* tp_methods */
   2139     0,                                          /* tp_members */
   2140     float_getset,                               /* tp_getset */
   2141     0,                                          /* tp_base */
   2142     0,                                          /* tp_dict */
   2143     0,                                          /* tp_descr_get */
   2144     0,                                          /* tp_descr_set */
   2145     0,                                          /* tp_dictoffset */
   2146     0,                                          /* tp_init */
   2147     0,                                          /* tp_alloc */
   2148     float_new,                                  /* tp_new */
   2149 };
   2150 
   2151 void
   2152 _PyFloat_Init(void)
   2153 {
   2154     /* We attempt to determine if this machine is using IEEE
   2155        floating point formats by peering at the bits of some
   2156        carefully chosen values.  If it looks like we are on an
   2157        IEEE platform, the float packing/unpacking routines can
   2158        just copy bits, if not they resort to arithmetic & shifts
   2159        and masks.  The shifts & masks approach works on all finite
   2160        values, but what happens to infinities, NaNs and signed
   2161        zeroes on packing is an accident, and attempting to unpack
   2162        a NaN or an infinity will raise an exception.
   2163 
   2164        Note that if we're on some whacked-out platform which uses
   2165        IEEE formats but isn't strictly little-endian or big-
   2166        endian, we will fall back to the portable shifts & masks
   2167        method. */
   2168 
   2169 #if SIZEOF_DOUBLE == 8
   2170     {
   2171         double x = 9006104071832581.0;
   2172         if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
   2173             detected_double_format = ieee_big_endian_format;
   2174         else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
   2175             detected_double_format = ieee_little_endian_format;
   2176         else
   2177             detected_double_format = unknown_format;
   2178     }
   2179 #else
   2180     detected_double_format = unknown_format;
   2181 #endif
   2182 
   2183 #if SIZEOF_FLOAT == 4
   2184     {
   2185         float y = 16711938.0;
   2186         if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
   2187             detected_float_format = ieee_big_endian_format;
   2188         else if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
   2189             detected_float_format = ieee_little_endian_format;
   2190         else
   2191             detected_float_format = unknown_format;
   2192     }
   2193 #else
   2194     detected_float_format = unknown_format;
   2195 #endif
   2196 
   2197     double_format = detected_double_format;
   2198     float_format = detected_float_format;
   2199 
   2200     /* Init float info */
   2201     if (FloatInfoType.tp_name == 0)
   2202         PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
   2203 }
   2204 
   2205 int
   2206 PyFloat_ClearFreeList(void)
   2207 {
   2208     PyFloatObject *p;
   2209     PyFloatBlock *list, *next;
   2210     int i;
   2211     int u;                      /* remaining unfreed ints per block */
   2212     int freelist_size = 0;
   2213 
   2214     list = block_list;
   2215     block_list = NULL;
   2216     free_list = NULL;
   2217     while (list != NULL) {
   2218         u = 0;
   2219         for (i = 0, p = &list->objects[0];
   2220              i < N_FLOATOBJECTS;
   2221              i++, p++) {
   2222             if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 0)
   2223                 u++;
   2224         }
   2225         next = list->next;
   2226         if (u) {
   2227             list->next = block_list;
   2228             block_list = list;
   2229             for (i = 0, p = &list->objects[0];
   2230                  i < N_FLOATOBJECTS;
   2231                  i++, p++) {
   2232                 if (!PyFloat_CheckExact(p) ||
   2233                     Py_REFCNT(p) == 0) {
   2234                     Py_TYPE(p) = (struct _typeobject *)
   2235                         free_list;
   2236                     free_list = p;
   2237                 }
   2238             }
   2239         }
   2240         else {
   2241             PyMem_FREE(list);
   2242         }
   2243         freelist_size += u;
   2244         list = next;
   2245     }
   2246     return freelist_size;
   2247 }
   2248 
   2249 void
   2250 PyFloat_Fini(void)
   2251 {
   2252     PyFloatObject *p;
   2253     PyFloatBlock *list;
   2254     int i;
   2255     int u;                      /* total unfreed floats per block */
   2256 
   2257     u = PyFloat_ClearFreeList();
   2258 
   2259     if (!Py_VerboseFlag)
   2260         return;
   2261     fprintf(stderr, "# cleanup floats");
   2262     if (!u) {
   2263         fprintf(stderr, "\n");
   2264     }
   2265     else {
   2266         fprintf(stderr,
   2267             ": %d unfreed float%s\n",
   2268             u, u == 1 ? "" : "s");
   2269     }
   2270     if (Py_VerboseFlag > 1) {
   2271         list = block_list;
   2272         while (list != NULL) {
   2273             for (i = 0, p = &list->objects[0];
   2274                  i < N_FLOATOBJECTS;
   2275                  i++, p++) {
   2276                 if (PyFloat_CheckExact(p) &&
   2277                     Py_REFCNT(p) != 0) {
   2278                     char *buf = PyOS_double_to_string(
   2279                         PyFloat_AS_DOUBLE(p), 'r',
   2280                         0, 0, NULL);
   2281                     if (buf) {
   2282                         /* XXX(twouters) cast
   2283                            refcount to long
   2284                            until %zd is
   2285                            universally
   2286                            available
   2287                         */
   2288                         fprintf(stderr,
   2289                  "#   <float at %p, refcnt=%ld, val=%s>\n",
   2290                                     p, (long)Py_REFCNT(p), buf);
   2291                                     PyMem_Free(buf);
   2292                             }
   2293                 }
   2294             }
   2295             list = list->next;
   2296         }
   2297     }
   2298 }
   2299 
   2300 /*----------------------------------------------------------------------------
   2301  * _PyFloat_{Pack,Unpack}{4,8}.  See floatobject.h.
   2302  */
   2303 int
   2304 _PyFloat_Pack4(double x, unsigned char *p, int le)
   2305 {
   2306     if (float_format == unknown_format) {
   2307         unsigned char sign;
   2308         int e;
   2309         double f;
   2310         unsigned int fbits;
   2311         int incr = 1;
   2312 
   2313         if (le) {
   2314             p += 3;
   2315             incr = -1;
   2316         }
   2317 
   2318         if (x < 0) {
   2319             sign = 1;
   2320             x = -x;
   2321         }
   2322         else
   2323             sign = 0;
   2324 
   2325         f = frexp(x, &e);
   2326 
   2327         /* Normalize f to be in the range [1.0, 2.0) */
   2328         if (0.5 <= f && f < 1.0) {
   2329             f *= 2.0;
   2330             e--;
   2331         }
   2332         else if (f == 0.0)
   2333             e = 0;
   2334         else {
   2335             PyErr_SetString(PyExc_SystemError,
   2336                             "frexp() result out of range");
   2337             return -1;
   2338         }
   2339 
   2340         if (e >= 128)
   2341             goto Overflow;
   2342         else if (e < -126) {
   2343             /* Gradual underflow */
   2344             f = ldexp(f, 126 + e);
   2345             e = 0;
   2346         }
   2347         else if (!(e == 0 && f == 0.0)) {
   2348             e += 127;
   2349             f -= 1.0; /* Get rid of leading 1 */
   2350         }
   2351 
   2352         f *= 8388608.0; /* 2**23 */
   2353         fbits = (unsigned int)(f + 0.5); /* Round */
   2354         assert(fbits <= 8388608);
   2355         if (fbits >> 23) {
   2356             /* The carry propagated out of a string of 23 1 bits. */
   2357             fbits = 0;
   2358             ++e;
   2359             if (e >= 255)
   2360                 goto Overflow;
   2361         }
   2362 
   2363         /* First byte */
   2364         *p = (sign << 7) | (e >> 1);
   2365         p += incr;
   2366 
   2367         /* Second byte */
   2368         *p = (char) (((e & 1) << 7) | (fbits >> 16));
   2369         p += incr;
   2370 
   2371         /* Third byte */
   2372         *p = (fbits >> 8) & 0xFF;
   2373         p += incr;
   2374 
   2375         /* Fourth byte */
   2376         *p = fbits & 0xFF;
   2377 
   2378         /* Done */
   2379         return 0;
   2380 
   2381     }
   2382     else {
   2383         float y = (float)x;
   2384         const char *s = (char*)&y;
   2385         int i, incr = 1;
   2386 
   2387         if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x))
   2388             goto Overflow;
   2389 
   2390         if ((float_format == ieee_little_endian_format && !le)
   2391             || (float_format == ieee_big_endian_format && le)) {
   2392             p += 3;
   2393             incr = -1;
   2394         }
   2395 
   2396         for (i = 0; i < 4; i++) {
   2397             *p = *s++;
   2398             p += incr;
   2399         }
   2400         return 0;
   2401     }
   2402   Overflow:
   2403     PyErr_SetString(PyExc_OverflowError,
   2404                     "float too large to pack with f format");
   2405     return -1;
   2406 }
   2407 
   2408 int
   2409 _PyFloat_Pack8(double x, unsigned char *p, int le)
   2410 {
   2411     if (double_format == unknown_format) {
   2412         unsigned char sign;
   2413         int e;
   2414         double f;
   2415         unsigned int fhi, flo;
   2416         int incr = 1;
   2417 
   2418         if (le) {
   2419             p += 7;
   2420             incr = -1;
   2421         }
   2422 
   2423         if (x < 0) {
   2424             sign = 1;
   2425             x = -x;
   2426         }
   2427         else
   2428             sign = 0;
   2429 
   2430         f = frexp(x, &e);
   2431 
   2432         /* Normalize f to be in the range [1.0, 2.0) */
   2433         if (0.5 <= f && f < 1.0) {
   2434             f *= 2.0;
   2435             e--;
   2436         }
   2437         else if (f == 0.0)
   2438             e = 0;
   2439         else {
   2440             PyErr_SetString(PyExc_SystemError,
   2441                             "frexp() result out of range");
   2442             return -1;
   2443         }
   2444 
   2445         if (e >= 1024)
   2446             goto Overflow;
   2447         else if (e < -1022) {
   2448             /* Gradual underflow */
   2449             f = ldexp(f, 1022 + e);
   2450             e = 0;
   2451         }
   2452         else if (!(e == 0 && f == 0.0)) {
   2453             e += 1023;
   2454             f -= 1.0; /* Get rid of leading 1 */
   2455         }
   2456 
   2457         /* fhi receives the high 28 bits; flo the low 24 bits (== 52 bits) */
   2458         f *= 268435456.0; /* 2**28 */
   2459         fhi = (unsigned int)f; /* Truncate */
   2460         assert(fhi < 268435456);
   2461 
   2462         f -= (double)fhi;
   2463         f *= 16777216.0; /* 2**24 */
   2464         flo = (unsigned int)(f + 0.5); /* Round */
   2465         assert(flo <= 16777216);
   2466         if (flo >> 24) {
   2467             /* The carry propagated out of a string of 24 1 bits. */
   2468             flo = 0;
   2469             ++fhi;
   2470             if (fhi >> 28) {
   2471                 /* And it also progagated out of the next 28 bits. */
   2472                 fhi = 0;
   2473                 ++e;
   2474                 if (e >= 2047)
   2475                     goto Overflow;
   2476             }
   2477         }
   2478 
   2479         /* First byte */
   2480         *p = (sign << 7) | (e >> 4);
   2481         p += incr;
   2482 
   2483         /* Second byte */
   2484         *p = (unsigned char) (((e & 0xF) << 4) | (fhi >> 24));
   2485         p += incr;
   2486 
   2487         /* Third byte */
   2488         *p = (fhi >> 16) & 0xFF;
   2489         p += incr;
   2490 
   2491         /* Fourth byte */
   2492         *p = (fhi >> 8) & 0xFF;
   2493         p += incr;
   2494 
   2495         /* Fifth byte */
   2496         *p = fhi & 0xFF;
   2497         p += incr;
   2498 
   2499         /* Sixth byte */
   2500         *p = (flo >> 16) & 0xFF;
   2501         p += incr;
   2502 
   2503         /* Seventh byte */
   2504         *p = (flo >> 8) & 0xFF;
   2505         p += incr;
   2506 
   2507         /* Eighth byte */
   2508         *p = flo & 0xFF;
   2509         /* p += incr; Unneeded (for now) */
   2510 
   2511         /* Done */
   2512         return 0;
   2513 
   2514       Overflow:
   2515         PyErr_SetString(PyExc_OverflowError,
   2516                         "float too large to pack with d format");
   2517         return -1;
   2518     }
   2519     else {
   2520         const char *s = (char*)&x;
   2521         int i, incr = 1;
   2522 
   2523         if ((double_format == ieee_little_endian_format && !le)
   2524             || (double_format == ieee_big_endian_format && le)) {
   2525             p += 7;
   2526             incr = -1;
   2527         }
   2528 
   2529         for (i = 0; i < 8; i++) {
   2530             *p = *s++;
   2531             p += incr;
   2532         }
   2533         return 0;
   2534     }
   2535 }
   2536 
   2537 double
   2538 _PyFloat_Unpack4(const unsigned char *p, int le)
   2539 {
   2540     if (float_format == unknown_format) {
   2541         unsigned char sign;
   2542         int e;
   2543         unsigned int f;
   2544         double x;
   2545         int incr = 1;
   2546 
   2547         if (le) {
   2548             p += 3;
   2549             incr = -1;
   2550         }
   2551 
   2552         /* First byte */
   2553         sign = (*p >> 7) & 1;
   2554         e = (*p & 0x7F) << 1;
   2555         p += incr;
   2556 
   2557         /* Second byte */
   2558         e |= (*p >> 7) & 1;
   2559         f = (*p & 0x7F) << 16;
   2560         p += incr;
   2561 
   2562         if (e == 255) {
   2563             PyErr_SetString(
   2564                 PyExc_ValueError,
   2565                 "can't unpack IEEE 754 special value "
   2566                 "on non-IEEE platform");
   2567             return -1;
   2568         }
   2569 
   2570         /* Third byte */
   2571         f |= *p << 8;
   2572         p += incr;
   2573 
   2574         /* Fourth byte */
   2575         f |= *p;
   2576 
   2577         x = (double)f / 8388608.0;
   2578 
   2579         /* XXX This sadly ignores Inf/NaN issues */
   2580         if (e == 0)
   2581             e = -126;
   2582         else {
   2583             x += 1.0;
   2584             e -= 127;
   2585         }
   2586         x = ldexp(x, e);
   2587 
   2588         if (sign)
   2589             x = -x;
   2590 
   2591         return x;
   2592     }
   2593     else {
   2594         float x;
   2595 
   2596         if ((float_format == ieee_little_endian_format && !le)
   2597             || (float_format == ieee_big_endian_format && le)) {
   2598             char buf[4];
   2599             char *d = &buf[3];
   2600             int i;
   2601 
   2602             for (i = 0; i < 4; i++) {
   2603                 *d-- = *p++;
   2604             }
   2605             memcpy(&x, buf, 4);
   2606         }
   2607         else {
   2608             memcpy(&x, p, 4);
   2609         }
   2610 
   2611         return x;
   2612     }
   2613 }
   2614 
   2615 double
   2616 _PyFloat_Unpack8(const unsigned char *p, int le)
   2617 {
   2618     if (double_format == unknown_format) {
   2619         unsigned char sign;
   2620         int e;
   2621         unsigned int fhi, flo;
   2622         double x;
   2623         int incr = 1;
   2624 
   2625         if (le) {
   2626             p += 7;
   2627             incr = -1;
   2628         }
   2629 
   2630         /* First byte */
   2631         sign = (*p >> 7) & 1;
   2632         e = (*p & 0x7F) << 4;
   2633 
   2634         p += incr;
   2635 
   2636         /* Second byte */
   2637         e |= (*p >> 4) & 0xF;
   2638         fhi = (*p & 0xF) << 24;
   2639         p += incr;
   2640 
   2641         if (e == 2047) {
   2642             PyErr_SetString(
   2643                 PyExc_ValueError,
   2644                 "can't unpack IEEE 754 special value "
   2645                 "on non-IEEE platform");
   2646             return -1.0;
   2647         }
   2648 
   2649         /* Third byte */
   2650         fhi |= *p << 16;
   2651         p += incr;
   2652 
   2653         /* Fourth byte */
   2654         fhi |= *p  << 8;
   2655         p += incr;
   2656 
   2657         /* Fifth byte */
   2658         fhi |= *p;
   2659         p += incr;
   2660 
   2661         /* Sixth byte */
   2662         flo = *p << 16;
   2663         p += incr;
   2664 
   2665         /* Seventh byte */
   2666         flo |= *p << 8;
   2667         p += incr;
   2668 
   2669         /* Eighth byte */
   2670         flo |= *p;
   2671 
   2672         x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
   2673         x /= 268435456.0; /* 2**28 */
   2674 
   2675         if (e == 0)
   2676             e = -1022;
   2677         else {
   2678             x += 1.0;
   2679             e -= 1023;
   2680         }
   2681         x = ldexp(x, e);
   2682 
   2683         if (sign)
   2684             x = -x;
   2685 
   2686         return x;
   2687     }
   2688     else {
   2689         double x;
   2690 
   2691         if ((double_format == ieee_little_endian_format && !le)
   2692             || (double_format == ieee_big_endian_format && le)) {
   2693             char buf[8];
   2694             char *d = &buf[7];
   2695             int i;
   2696 
   2697             for (i = 0; i < 8; i++) {
   2698                 *d-- = *p++;
   2699             }
   2700             memcpy(&x, buf, 8);
   2701         }
   2702         else {
   2703             memcpy(&x, p, 8);
   2704         }
   2705 
   2706         return x;
   2707     }
   2708 }
   2709