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