summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristján Valur Jónsson <kristjan@ccpgames.com>2006-05-25 15:53:30 (GMT)
committerKristján Valur Jónsson <kristjan@ccpgames.com>2006-05-25 15:53:30 (GMT)
commitf94323fbb4e83b756b1f328f06a1615d8c366c20 (patch)
tree0162fcea03d1e3ba5aeec93b1cff612dd19c01d7
parent4b4e33ef14cecd0bc9c6566ea8b402733e7e445f (diff)
downloadcpython-f94323fbb4e83b756b1f328f06a1615d8c366c20.zip
cpython-f94323fbb4e83b756b1f328f06a1615d8c366c20.tar.gz
cpython-f94323fbb4e83b756b1f328f06a1615d8c366c20.tar.bz2
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
-rw-r--r--Include/pyport.h9
-rw-r--r--Objects/floatobject.c7
-rw-r--r--PC/pyconfig.h1
3 files changed, 12 insertions, 5 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index df44be6..66726e8 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 7650ae6..fa09084 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 a9c1613..cb42131 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -162,6 +162,7 @@ typedef int pid_t;
#include <float.h>
#define Py_IS_NAN _isnan
#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X))
+#define Py_IS_FINITE(X) _finite(X)
#endif /* _MSC_VER */