bpo-46640: Py_NAN now uses the C99 NAN constant (GH-31134)

Building Python now requires a C99 <math.h> header file providing a
NAN constant, or the __builtin_nan() built-in function. If a platform
does not support Not-a-Number (NaN), the Py_NO_NAN macro can be
defined in the pyconfig.h file.
This commit is contained in:
Victor Stinner 2022-02-06 13:13:04 +01:00 committed by GitHub
parent f1e29cea85
commit 54842e4311
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 21 deletions

View File

@ -604,6 +604,12 @@ Build Changes
``isinf()``, ``isnan()``, ``round()``. ``isinf()``, ``isnan()``, ``round()``.
(Contributed by Victor Stinner in :issue:`45440`.) (Contributed by Victor Stinner in :issue:`45440`.)
* Building Python now requires a C99 ``<math.h>`` header file providing
a ``NAN`` constant, or the ``__builtin_nan()`` built-in function. If a
platform does not support Not-a-Number (NaN), the ``Py_NO_NAN`` macro can be
defined in the ``pyconfig.h`` file.
(Contributed by Victor Stinner in :issue:`46640`.)
* Freelists for object structs can now be disabled. A new :program:`configure` * Freelists for object structs can now be disabled. A new :program:`configure`
option :option:`!--without-freelists` can be used to disable all freelists option :option:`!--without-freelists` can be used to disable all freelists
except empty tuple singleton. except empty tuple singleton.

View File

@ -51,29 +51,18 @@
#endif #endif
/* Py_NAN /* Py_NAN
* A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or * A value that evaluates to a quiet Not-a-Number (NaN).
* INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform * Define Py_NO_NAN in pyconfig.h if your platform doesn't support NaNs.
* doesn't support NaNs.
*/ */
#if !defined(Py_NAN) && !defined(Py_NO_NAN) #if !defined(Py_NAN) && !defined(Py_NO_NAN)
# if !defined(__INTEL_COMPILER) # if _Py__has_builtin(__builtin_nan)
# define Py_NAN (Py_HUGE_VAL * 0.) // Built-in implementation of the ISO C99 function nan(): quiet NaN.
# else /* __INTEL_COMPILER */ # define Py_NAN (__builtin_nan(""))
# if defined(ICC_NAN_STRICT) #else
#pragma float_control(push) // Use C99 NAN constant: quiet Not-A-Number.
#pragma float_control(precise, on) // NAN is a float, Py_NAN is a double: cast to double.
#pragma float_control(except, on) # define Py_NAN ((double)NAN)
Py_NO_INLINE static double __icc_nan() # endif
{
return sqrt(-1.0);
}
#pragma float_control (pop)
# define Py_NAN __icc_nan()
# else /* ICC_NAN_RELAXED as default for Intel Compiler */
static const union { unsigned char buf[8]; double __icc_nan; } __nan_store = {0,0,0,0,0,0,0xf8,0x7f};
# define Py_NAN (__nan_store.__icc_nan)
# endif /* ICC_NAN_STRICT */
# endif /* __INTEL_COMPILER */
#endif #endif
#endif /* Py_PYMATH_H */ #endif /* Py_PYMATH_H */

View File

@ -0,0 +1,4 @@
Building Python now requires a C99 ``<math.h>`` header file providing a ``NAN``
constant, or the ``__builtin_nan()`` built-in function. If a platform does not
support Not-a-Number (NaN), the ``Py_NO_NAN`` macro can be defined in the
``pyconfig.h`` file. Patch by Victor Stinner.