summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2004-09-23 19:11:32 (GMT)
committerTim Peters <tim.peters@gmail.com>2004-09-23 19:11:32 (GMT)
commit862f0593d8e8c7cd510b598296c73b25168d0472 (patch)
treeb08e666ab49cab220687ec84959a37301dc076ae
parent307fa78107c39ffda1eb4ad18201d25650354c4e (diff)
downloadcpython-862f0593d8e8c7cd510b598296c73b25168d0472.zip
cpython-862f0593d8e8c7cd510b598296c73b25168d0472.tar.gz
cpython-862f0593d8e8c7cd510b598296c73b25168d0472.tar.bz2
Introduced a Py_IS_NAN macro, which probably works on the major platforms
today. pyconfig.h can override it if not, and can also override Py_IS_INFINITY now. Py_IS_NAN and Py_IS_INFINITY are overridden now for Microsoft compilers, using efficient MS-specific spellings.
-rw-r--r--Include/pyport.h19
-rw-r--r--Misc/NEWS6
-rw-r--r--PC/pyconfig.h4
3 files changed, 26 insertions, 3 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index b20bc15..f71b9f4 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -219,14 +219,29 @@ extern "C" {
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
#endif
+/* Py_IS_NAN(X)
+ * Return 1 if float or double arg is a NaN, else 0.
+ * Caution:
+ * X is evaluated more than once.
+ * This may not work on all platforms. Each platform has *some*
+ * way to spell this, though -- override in pyconfig.h if you have
+ * a platform where it doesn't work.
+ */
+#ifndef Py_IS_NAN
+#define Py_IS_NAN(X) ((X) != (X))
+#endif
+
/* Py_IS_INFINITY(X)
* Return 1 if float or double arg is an infinity, else 0.
* Caution:
* X is evaluated more than once.
* This implementation may set the underflow flag if |X| is very small;
* it really can't be implemented correctly (& easily) before C99.
+ * Override in pyconfig.h if you have a better spelling on your platform.
*/
+#ifndef Py_IS_INFINITY
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (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
@@ -257,12 +272,12 @@ extern "C" {
* Some platforms have better way to spell this, so expect some #ifdef'ery.
*
* OpenBSD uses 'isinf()' because a compiler bug on that platform causes
- * the longer macro version to be mis-compiled. This isn't optimal, and
+ * the longer macro version to be mis-compiled. This isn't optimal, and
* should be removed once a newer compiler is available on that platform.
* The system that had the failure was running OpenBSD 3.2 on Intel, with
* gcc 2.95.3.
*
- * According to Tim's checkin, the FreeBSD systems use isinf() to work
+ * According to Tim's checkin, the FreeBSD systems use isinf() to work
* around a FPE bug on that platform.
*/
#if defined(__FreeBSD__) || defined(__OpenBSD__)
diff --git a/Misc/NEWS b/Misc/NEWS
index 89a6c57..d3f4fe4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -74,7 +74,11 @@ Library
Build
-----
-...
+- pyport.h now defines a Py_IS_NAN macro. It works as-is when the
+ platform C computes true for ``x != x`` if and only if X is a NaN.
+ Other platforms can override the default definition with a platform-
+ specific spelling in that platform's pyconfig.h. You can also override
+ pyport.h's default Py_IS_INFINITY definition now.
C API
-----
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index 495d90c..4d1872c 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -118,6 +118,10 @@ MS_CORE_DLL.
typedef int pid_t;
#define hypot _hypot
+#include <float.h>
+#define Py_IS_NAN _isnan
+#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X))
+
#endif /* _MSC_VER */
/* define some ANSI types that are not defined in earlier Win headers */