Index: floatobject.c =================================================================== --- floatobject.c (revision 64402) +++ floatobject.c (working copy) @@ -1204,8 +1204,53 @@ ">>> (-.25).as_integer_ratio()\n" "(-1, 4)"); +static PyObject * +_float_to_base(PyFloatObject *v, int base, unaryfunc int_to_base) +{ + PyObject *mant, *intmant, *result, *exp_str; + double x, fr; + int i, exp; + CONVERT_TO_DOUBLE(((PyObject *)v), x); + if (!Py_IS_FINITE(x)) + return PyObject_Repr((PyObject *)v); + fr = frexp(x, &exp); + for (i=0; i<300 && fr != floor(fr) ; i++) { + fr *= 2.0; + exp--; + } + mant = PyLong_FromDouble(floor(fr)); + if (mant == NULL) + return NULL; + intmant = PyNumber_Int(mant); + Py_DECREF(mant); + if (intmant == NULL) + return NULL; + result = int_to_base(intmant); + Py_DECREF(intmant); + exp_str = PyString_FromFormat(" * %d.0 ** %d", base, exp); + if (exp_str == NULL) { + Py_DECREF(result); + return NULL; + } + PyString_Concat(&result, exp_str); + Py_DECREF(exp_str); + return result; +} + static PyObject * +float_hex(PyFloatObject *v) +{ + return _float_to_base(v, 16, PyInt_Type.tp_as_number->nb_hex); +} + +static PyObject * +float_oct(PyFloatObject *v) +{ + return _float_to_base(v, 8, PyInt_Type.tp_as_number->nb_oct); +} + +static PyObject * float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static PyObject * @@ -1490,8 +1535,8 @@ float_trunc, /*nb_int*/ float_trunc, /*nb_long*/ float_float, /*nb_float*/ - 0, /* nb_oct */ - 0, /* nb_hex */ + (unaryfunc)float_oct, /* nb_oct */ + (unaryfunc)float_hex, /* nb_hex */ 0, /* nb_inplace_add */ 0, /* nb_inplace_subtract */ 0, /* nb_inplace_multiply */