From 862f0593d8e8c7cd510b598296c73b25168d0472 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Thu, 23 Sep 2004 19:11:32 +0000 Subject: [PATCH] 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. --- Include/pyport.h | 19 +++++++++++++++++-- Misc/NEWS | 6 +++++- PC/pyconfig.h | 4 ++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index b20bc15291f..f71b9f4ab90 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 89a6c5712f8..d3f4fe4b8b8 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 495d90cfbfb..4d1872ce0b4 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -118,6 +118,10 @@ MS_CORE_DLL. typedef int pid_t; #define hypot _hypot +#include +#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 */