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,
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
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
* 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 <sys.float_info>`: 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
-------
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)
--- /dev/null
+Add :data:`sys.float_info.iec_60559 <sys.float_info>`: a boolean flag,
+indicating support the IEC 60559 floating-point standard (as specified by the
+Annex F of C99). Patch by Sergey B Kirpichev.
{"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}
};
"sys.float_info", /* name */
floatinfo__doc__, /* doc */
floatinfo_fields, /* fields */
- 11
+ 12
};
PyObject *
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