From: Kristján Valur Jónsson Date: Thu, 25 May 2006 15:53:30 +0000 (+0000) Subject: Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and... X-Git-Tag: v2.5b1~541 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f94323fbb4e83b756b1f328f06a1615d8c366c20;p=python Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and it is more efficient than to use !Py_IS_INFINITE(X) && !Py_IS_NAN(X). No change on other platforms --- diff --git a/Include/pyport.h b/Include/pyport.h index df44be698b..66726e8a43 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -295,6 +295,15 @@ extern "C" { #define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X)) #endif +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * This some archicetcures (windows) have intrisics for this, so a special + * macro for this particular test is useful + */ +#ifndef Py_IS_FINITE +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif + /* HUGE_VAL is supposed to expand to a positive double infinity. Python * uses Py_HUGE_VAL instead because some platforms are broken in this * respect. We used to embed code in pyport.h to try to worm around that, diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 7650ae6934..fa09084669 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -384,7 +384,7 @@ float_richcompare(PyObject *v, PyObject *w, int op) if (PyFloat_Check(w)) j = PyFloat_AS_DOUBLE(w); - else if (Py_IS_INFINITY(i) || Py_IS_NAN(i)) { + else if (!Py_IS_FINITE(i)) { if (PyInt_Check(w) || PyLong_Check(w)) /* If i is an infinity, its magnitude exceeds any * finite integer, so it doesn't matter which int we @@ -802,10 +802,7 @@ float_pow(PyObject *v, PyObject *w, PyObject *z) * bug; we let that slide in math.pow() (which currently * reflects all platform accidents), but not for Python's **. */ - if (iv == -1.0 && !Py_IS_INFINITY(iw) && iw == iw) { - /* XXX the "iw == iw" was to weed out NaNs. This - * XXX doesn't actually work on all platforms. - */ + if (iv == -1.0 && Py_IS_FINITE(iw)) { /* Return 1 if iw is even, -1 if iw is odd; there's * no guarantee that any C integral type is big * enough to hold iw, so we have to check this diff --git a/PC/pyconfig.h b/PC/pyconfig.h index a9c1613807..cb42131d4f 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -162,6 +162,7 @@ typedef int pid_t; #include #define Py_IS_NAN _isnan #define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) #endif /* _MSC_VER */