diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 4a11aec15dfb73..bb9983ed033814 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 b1461b0cbaf528..a034dce045cb8d 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -694,15 +694,16 @@ 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 - [C99]_, 'Characteristics of floating types', for details. + 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 +772,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/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index ace02de7142e06..0973c387a1e595 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -1015,6 +1015,11 @@ sys * Add :data:`sys.abi_info` namespace to improve access to ABI information. (Contributed by Klaus Zimmermann in :gh:`137476`.) +* Add :data:`sys.float_info.iec_60559 `: a boolean flag, + indicating support the IEC 60559 floating-point standard (as specified by the + Annex F of C99). + (Contributed by Sergey B Kirpichev in :gh:`138580`.) + tarfile ------- diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index a729efee18c3a1..c912e8dd9e05bd 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -641,7 +641,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..fd159db414e513 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-12-07-30-13.gh-issue-138580.Qr_fSH.rst @@ -0,0 +1,3 @@ +Add :data:`sys.float_info.iec_60559 `: 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 18871a4f3c51a9..b78fd3ccb47972 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