diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 186f99e9591546..199cce617ab1e2 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -848,7 +848,8 @@ Constants The :mod:`math` module consists mostly of thin wrappers around the platform C math library functions. Behavior in exceptional cases follows Annex F of - the C99 standard where appropriate. The current implementation will raise + the C99 standard, if :attr:`sys.float_info.iec_60559` is true. + The current implementation will raise :exc:`ValueError` for invalid operations like ``sqrt(-1.0)`` or ``log(0.0)`` (where C99 Annex F recommends signaling invalid operation or divide-by-zero), and :exc:`OverflowError` for results that overflow (for example, diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index a0621d4b0dbd09..0e116e7edeec1f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -694,15 +694,15 @@ always available. Unless explicitly noted otherwise, all variables are read-only A :term:`named tuple` holding information about the float type. It contains low level information about the precision and internal representation. The values correspond to the various floating-point - constants defined in the standard header file :file:`float.h` for the 'C' - programming language; see section 5.2.4.2.2 of the 1999 ISO/IEC C standard + constants defined by C implementation and in the standard header file :file:`float.h` for the 'C' + programming language; see Annex F and section 5.2.4.2.2 of the 1999 ISO/IEC C standard [C99]_, 'Characteristics of floating types', for details. .. list-table:: Attributes of the :data:`!float_info` :term:`named tuple` :header-rows: 1 * - attribute - - float.h macro + - C macro - explanation * - .. attribute:: float_info.epsilon @@ -771,6 +771,12 @@ always available. Unless explicitly noted otherwise, all variables are read-only All other values for :c:macro:`!FLT_ROUNDS` characterize implementation-defined rounding behavior. + * - .. attribute:: float_info.iec_60559 + - :c:macro:`!__STDC_IEC_559__` + - A boolean, indicating support the IEC 60559 floating-point standard. + If true, the :class:`float` type characteristics and behavior matches + the IEC 60559 double format. + The attribute :attr:`sys.float_info.dig` needs further explanation. If ``s`` is any string representing a decimal number with at most :attr:`!sys.float_info.dig` significant digits, then converting ``s`` to a diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 2e87e38fe5dfdc..b33aa4572d5d12 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -642,7 +642,7 @@ def test_attributes(self): self.assertIsInstance(sys.exec_prefix, str) self.assertIsInstance(sys.base_exec_prefix, str) self.assertIsInstance(sys.executable, str) - self.assertEqual(len(sys.float_info), 11) + self.assertEqual(len(sys.float_info), 12) self.assertEqual(sys.float_info.radix, 2) self.assertEqual(len(sys.int_info), 4) self.assertTrue(sys.int_info.bits_per_digit % 5 == 0) diff --git a/Misc/NEWS.d/next/Library/2025-09-12-07-30-13.gh-issue-138580.Qr_fSH.rst b/Misc/NEWS.d/next/Library/2025-09-12-07-30-13.gh-issue-138580.Qr_fSH.rst new file mode 100644 index 00000000000000..91556e3c92988c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-12-07-30-13.gh-issue-138580.Qr_fSH.rst @@ -0,0 +1,2 @@ +Add a boolean flag, indicating support the IEC 60559 floating-point standard +(as specified by the Annex F of C99). Patch by Sergey B Kirpichev. diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 78006783c6ec78..e9a856a4016b03 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -68,6 +68,8 @@ static PyStructSequence_Field floatinfo_fields[] = { {"radix", "FLT_RADIX -- radix of exponent"}, {"rounds", "FLT_ROUNDS -- rounding mode used for arithmetic " "operations"}, + {"iec_60559", "test if implementation supports the IEC 60559 " + "floating-point standard"}, {0} }; @@ -75,7 +77,7 @@ static PyStructSequence_Desc floatinfo_desc = { "sys.float_info", /* name */ floatinfo__doc__, /* doc */ floatinfo_fields, /* fields */ - 11 + 12 }; PyObject * @@ -113,6 +115,11 @@ PyFloat_GetInfo(void) SetDblFlag(DBL_EPSILON); SetIntFlag(FLT_RADIX); SetIntFlag(FLT_ROUNDS); +#ifdef __STDC_IEC_559__ + SetFlag(PyBool_FromLong(1)); +#else + SetFlag(PyBool_FromLong(0)); +#endif #undef SetIntFlag #undef SetDblFlag #undef SetFlag