]> granicus.if.org Git - python/commitdiff
Introduced a Py_IS_NAN macro, which probably works on the major platforms
authorTim Peters <tim.peters@gmail.com>
Thu, 23 Sep 2004 19:11:32 +0000 (19:11 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 23 Sep 2004 19:11:32 +0000 (19:11 +0000)
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.

Include/pyport.h
Misc/NEWS
PC/pyconfig.h

index b20bc15291f3818adaccf5bf57a1cf7da5d7581c..f71b9f4ab901710d674783f88dd7bd4971848caf 100644 (file)
@@ -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__)
index 89a6c5712f8605e7352a4f243c0cf3e227fc4ca9..d3f4fe4b8b81da0c9a6bdde7f07753c568164600 100644 (file)
--- 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
 -----
index 495d90cfbfbc5abdda93dc3248eaa0c604cbd845..4d1872ce0b4a8bf34b5c9f3f223839a58779d5f6 100644 (file)
@@ -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 */