Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
bpo-46640: Py_NAN now uses the C99 NAN constant
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.
  • Loading branch information
vstinner committed Feb 5, 2022
commit b04c63098de3bd27c426496c2593060f2e1311e9
6 changes: 6 additions & 0 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,12 @@ Build Changes
``isinf()``, ``isnan()``, ``round()``.
(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.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that building under Py_NO_NAN doesn't actually work right now. I've opened an issue: https://bugs.python.org/issue46656

(Contributed by Victor Stinner in :issue:`46640`.)

* Freelists for object structs can now be disabled. A new :program:`configure`
option :option:`!--without-freelists` can be used to disable all freelists
except empty tuple singleton.
Expand Down
26 changes: 8 additions & 18 deletions Include/pymath.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,24 +56,14 @@
* doesn't support NaNs.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this change, the comment about INF*0 or INF/INF working is out of date; that sentence should probably be removed.

*/
#if !defined(Py_NAN) && !defined(Py_NO_NAN)
# if !defined(__INTEL_COMPILER)
# define Py_NAN (Py_HUGE_VAL * 0.)
# else /* __INTEL_COMPILER */
# if defined(ICC_NAN_STRICT)
#pragma float_control(push)
#pragma float_control(precise, on)
#pragma float_control(except, on)
Py_NO_INLINE static double __icc_nan()
{
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 */
# if _Py__has_builtin(__builtin_nan)
// Built-in implementation of the ISO C99 function nan(): quiet NaN.
# define Py_NAN (__builtin_nan(""))
#else
// Use C99 NAN constant: quiet Not-A-Number (when supported).
// NAN is a float, Py_NAN is a double: cast to double.
# define Py_NAN ((double)NAN)
# endif
#endif

#endif /* Py_PYMATH_H */
Original file line number Diff line number Diff line change
@@ -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.