[Python-checkins] CVS: python/dist/src/Objects floatobject.c,2.75,2.76
Neil Schemenauer
python-dev@python.org
Wed, 03 Jan 2001 17:44:37 -0800
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv22446/Objects
Modified Files:
floatobject.c
Log Message:
Make float a new style number type.
Index: floatobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/floatobject.c,v
retrieving revision 2.75
retrieving revision 2.76
diff -C2 -r2.75 -r2.76
*** floatobject.c 2000/10/24 19:57:45 2.75
--- floatobject.c 2001/01/04 01:44:34 2.76
***************
*** 257,260 ****
--- 257,292 ----
}
+ /* Macro and helper that convert PyObject obj to a C double and store
+ the value in dbl; this replaces the functionality of the coercion
+ slot function */
+
+ #define CONVERT_TO_DOUBLE(obj, dbl) \
+ if (PyFloat_Check(obj)) \
+ dbl = PyFloat_AS_DOUBLE(obj); \
+ else if (convert_to_double(&(obj), &(dbl)) < 0) \
+ return obj;
+
+ static int
+ convert_to_double(PyObject **v,
+ double *dbl)
+ {
+ register PyObject *obj = *v;
+
+ if (PyInt_Check(obj)) {
+ *dbl = (double)PyInt_AS_LONG(obj);
+ }
+ else if (PyLong_Check(obj)) {
+ PyFPE_START_PROTECT("convert_to_double", {*v=NULL;return -1;})
+ *dbl = PyLong_AsDouble(obj);
+ PyFPE_END_PROTECT(result)
+ }
+ else {
+ Py_INCREF(Py_NotImplemented);
+ *v = Py_NotImplemented;
+ return -1;
+ }
+ return 0;
+ }
+
/* Precisions used by repr() and str(), respectively.
***************
*** 315,318 ****
--- 347,359 ----
}
+ /* Needed for the new style number compare slots */
+ static PyObject *
+ float_cmp(PyObject *v, PyObject *w)
+ {
+ double a,b;
+ CONVERT_TO_DOUBLE(v, a);
+ CONVERT_TO_DOUBLE(w, b);
+ return PyInt_FromLong((a < b) ? -1 : (a > b) ? 1 : 0);
+ }
static long
***************
*** 323,376 ****
static PyObject *
! float_add(PyFloatObject *v, PyFloatObject *w)
{
! double result;
PyFPE_START_PROTECT("add", return 0)
! result = v->ob_fval + w->ob_fval;
! PyFPE_END_PROTECT(result)
! return PyFloat_FromDouble(result);
}
static PyObject *
! float_sub(PyFloatObject *v, PyFloatObject *w)
{
! double result;
PyFPE_START_PROTECT("subtract", return 0)
! result = v->ob_fval - w->ob_fval;
! PyFPE_END_PROTECT(result)
! return PyFloat_FromDouble(result);
}
static PyObject *
! float_mul(PyFloatObject *v, PyFloatObject *w)
{
! double result;
!
PyFPE_START_PROTECT("multiply", return 0)
! result = v->ob_fval * w->ob_fval;
! PyFPE_END_PROTECT(result)
! return PyFloat_FromDouble(result);
}
static PyObject *
! float_div(PyFloatObject *v, PyFloatObject *w)
{
! double result;
! if (w->ob_fval == 0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float division");
return NULL;
}
PyFPE_START_PROTECT("divide", return 0)
! result = v->ob_fval / w->ob_fval;
! PyFPE_END_PROTECT(result)
! return PyFloat_FromDouble(result);
}
static PyObject *
! float_rem(PyFloatObject *v, PyFloatObject *w)
{
double vx, wx;
double mod;
! wx = w->ob_fval;
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
--- 364,425 ----
static PyObject *
! float_add(PyObject *v, PyObject *w)
{
! double a,b;
! CONVERT_TO_DOUBLE(v, a);
! CONVERT_TO_DOUBLE(w, b);
PyFPE_START_PROTECT("add", return 0)
! a = a + b;
! PyFPE_END_PROTECT(a)
! return PyFloat_FromDouble(a);
}
static PyObject *
! float_sub(PyObject *v, PyObject *w)
{
! double a,b;
! CONVERT_TO_DOUBLE(v, a);
! CONVERT_TO_DOUBLE(w, b);
PyFPE_START_PROTECT("subtract", return 0)
! a = a - b;
! PyFPE_END_PROTECT(a)
! return PyFloat_FromDouble(a);
}
static PyObject *
! float_mul(PyObject *v, PyObject *w)
{
! double a,b;
! CONVERT_TO_DOUBLE(v, a);
! CONVERT_TO_DOUBLE(w, b);
PyFPE_START_PROTECT("multiply", return 0)
! a = a * b;
! PyFPE_END_PROTECT(a)
! return PyFloat_FromDouble(a);
}
static PyObject *
! float_div(PyObject *v, PyObject *w)
{
! double a,b;
! CONVERT_TO_DOUBLE(v, a);
! CONVERT_TO_DOUBLE(w, b);
! if (b == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float division");
return NULL;
}
PyFPE_START_PROTECT("divide", return 0)
! a = a / b;
! PyFPE_END_PROTECT(a)
! return PyFloat_FromDouble(a);
}
static PyObject *
! float_rem(PyObject *v, PyObject *w)
{
double vx, wx;
double mod;
! CONVERT_TO_DOUBLE(v, vx);
! CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
***************
*** 378,382 ****
}
PyFPE_START_PROTECT("modulo", return 0)
- vx = v->ob_fval;
mod = fmod(vx, wx);
/* note: checking mod*wx < 0 is incorrect -- underflows to
--- 427,430 ----
***************
*** 390,398 ****
static PyObject *
! float_divmod(PyFloatObject *v, PyFloatObject *w)
{
double vx, wx;
double div, mod, floordiv;
! wx = w->ob_fval;
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
--- 438,447 ----
static PyObject *
! float_divmod(PyObject *v, PyObject *w)
{
double vx, wx;
double div, mod, floordiv;
! CONVERT_TO_DOUBLE(v, vx);
! CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
***************
*** 400,404 ****
}
PyFPE_START_PROTECT("divmod", return 0)
- vx = v->ob_fval;
mod = fmod(vx, wx);
/* fmod is typically exact, so vx-mod is *mathematically* an
--- 449,452 ----
***************
*** 438,442 ****
static PyObject *
! float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
{
double iv, iw, ix;
--- 486,490 ----
static PyObject *
! float_pow(PyObject *v, PyObject *w, PyObject *z)
{
double iv, iw, ix;
***************
*** 447,452 ****
* [AMK]
*/
! iv = v->ob_fval;
! iw = ((PyFloatObject *)w)->ob_fval;
intw = (long)iw;
--- 495,500 ----
* [AMK]
*/
! CONVERT_TO_DOUBLE(v, iv);
! CONVERT_TO_DOUBLE(w, iw);
intw = (long)iw;
***************
*** 455,461 ****
PyFPE_START_PROTECT("pow", return NULL)
if ((PyObject *)z != Py_None) {
! ix = fmod(1.0, z->ob_fval);
! if (ix != 0 && z->ob_fval < 0)
! ix += z->ob_fval;
}
else
--- 503,510 ----
PyFPE_START_PROTECT("pow", return NULL)
if ((PyObject *)z != Py_None) {
! double iz;
! CONVERT_TO_DOUBLE(w, iz);
! ix=fmod(1.0, iz);
! if (ix!=0 && iz<0) ix+=iz;
}
else
***************
*** 502,514 ****
}
if ((PyObject *)z != Py_None) {
! PyFPE_START_PROTECT("pow", return NULL)
! ix = fmod(ix, z->ob_fval); /* XXX To Be Rewritten */
! if (ix != 0 &&
! ((iv < 0 && z->ob_fval > 0) ||
! (iv > 0 && z->ob_fval < 0)
! )) {
! ix += z->ob_fval;
}
! PyFPE_END_PROTECT(ix)
}
return PyFloat_FromDouble(ix);
--- 551,562 ----
}
if ((PyObject *)z != Py_None) {
! double iz;
! CONVERT_TO_DOUBLE(z, iz);
! PyFPE_START_PROTECT("pow", return 0)
! ix=fmod(ix, iz); /* XXX To Be Rewritten */
! if (ix!=0 && ((iv<0 && iz>0) || (iv>0 && iz<0) )) {
! ix+=iz;
}
! PyFPE_END_PROTECT(ix)
}
return PyFloat_FromDouble(ix);
***************
*** 612,615 ****
--- 660,677 ----
0, /*nb_oct*/
0, /*nb_hex*/
+ 0, /*nb_inplace_add*/
+ 0, /*nb_inplace_subtract*/
+ 0, /*nb_inplace_multiply*/
+ 0, /*nb_inplace_divide*/
+ 0, /*nb_inplace_remainder*/
+ 0, /*nb_inplace_power*/
+ 0, /*nb_inplace_lshift*/
+ 0, /*nb_inplace_rshift*/
+ 0, /*nb_inplace_and*/
+ 0, /*nb_inplace_xor*/
+ 0, /*nb_inplace_or*/
+
+ /* New style slots: */
+ (binaryfunc)float_cmp, /*nb_cmp*/
};
***************
*** 632,635 ****
--- 694,701 ----
0, /*tp_call*/
(reprfunc)float_str, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_NEWSTYLENUMBER /*tp_flags*/
};