This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Require IEEE 754 floating point to build Python 3.11
Type: Stage: patch review
Components: Build Versions: Python 3.11
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: mark.dickinson, vstinner
Priority: normal Keywords: patch

Created on 2022-03-03 22:39 by vstinner, last changed 2022-04-11 14:59 by admin.

Pull Requests
URL Status Linked Edit
PR 31790 merged vstinner, 2022-03-10 08:37
PR 31793 merged vstinner, 2022-03-10 13:47
Messages (7)
msg414485 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-03 22:39
See "[Python-Dev] Should we require IEEE 754 floating-point for CPython?" thread:
https://mail.python.org/archives/list/python-dev@python.org/thread/J5FSP6J4EITPY5C2UJI7HSL2GQCTCUWN/

I propose to require IEEE 754 floating-point to build Python 3.11. I propose the following build:

* Mention the new build requirement in What's New in Python 3.11.
* Modify configure script to make it fail if the IEEE 754 support is missing.
* Remove code handling missing NAN and infinity: float("nan"), float("inf"), math.nan and math.inf are always available.
* Remove @requires_IEEE_754 decorator of test.support and tests.
* Remove "unknown_format" code path of pack/unpack functions like _PyFloat_Pack8() (see bpo-46906 which proposes to make these functions public).


The _PY_SHORT_FLOAT_REPR==0 code path is kept. For now, platforms with float larger than 64-bit but without HAVE_PY_SET_53BIT_PRECISION are still supported (but don't get "short float repr"). See GH-31592 for details.


I prepared this requirement with these two changes:

commit 1b2611eb0283055835e5df632a7a735db8c894b8
Author: Victor Stinner <vstinner@python.org>
Date:   Fri Feb 25 01:32:57 2022 +0100

    bpo-46656: Remove Py_NO_NAN macro (GH-31160)
    
    Building Python now requires support for floating point Not-a-Number
    (NaN): remove the Py_NO_NAN macro.

commit 5ab745fc51e159ead28b523414e52f0bcc1ef353
Author: Victor Stinner <vstinner@python.org>
Date:   Sat Feb 26 00:53:27 2022 +0100

    bpo-46852: Remove the float.__set_format__() method (GH-31585)
    
    Remove the undocumented private float.__set_format__() method,
    previously known as float.__set_format__() in Python 3.7. Its
    docstring said: "You probably don't want to use this function. It
    exists mainly to be used in Python's test suite."


By the way, building Python 3.11 now requires a C11 compiler.
msg414575 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2022-03-05 11:54
> * Mention the new build requirement in What's New in Python 3.11.
> * Modify configure script to make it fail if the IEEE 754 support is missing.
> * Remove code handling missing NAN and infinity: float("nan"), float("inf"), math.nan and math.inf are always available.

That sounds fine.

> * Remove @requires_IEEE_754 decorator of test.support and tests.

I'd suggest leaving those decorators. Some of the tests are used by Python implementations other than CPython, and we're not requiring IEEE 754 on all Python implementations.

> * Remove "unknown_format" code path of pack/unpack functions like _PyFloat_Pack8() (see bpo-46906 which proposes to make these functions public).

Sounds fine.

> platforms with float larger than 64-bit

I'm assuming you mean Python "float" / C "double" here. There seems to be a persistent misunderstanding here, and I'd really like to be sure that everyone understands what the current code is doing before changing anything. There are *no* platforms that Python cares about where the C double is larger than 64-bits, and as far as I'm aware there never have been.

What there *is* is a set of platforms where the C double is IEEE 754 binary64 format, but where arithmetic operations between doubles may be performed in extended precision (usually 64-bit precision), so those arithmetic operations don't conform strictly to IEEE 754 semantics. Most flavours of Linux on x86 match that description.

Then there's a (possibly empty, but we don't know that for sure) subset of *that* set of platforms where we don't know how to temporarily enforce 53-bit precision during numeric parsing / formatting operations.

It's that second subset where dtoa.c can't be used, and where we need the fallback of the "legacy" float repr.

I'd be more than happy to deprecate and eventually remove support for the legacy float repr, but I think it's too big a change to make for 3.11: we'd need to deprecate the support for 3.11 and eventually remove it in 3.13.
msg414847 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-10 13:37
New changeset 9b51fd5d137b662c940f072297b30815f37f105b by Victor Stinner in branch 'main':
bpo-46917: Require IEEE 754 to build Python (GH-31790)
https://github.com/python/cpython/commit/9b51fd5d137b662c940f072297b30815f37f105b
msg414862 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-10 16:46
See also bpo-46906 "Add PyFloat_(Pack|Unpack)(2|4|8) to the public C API": the implementation supports non-IEEE 754 formats. Once the public C API is added, support for non-IEEE 754 formats should be removed.
msg414863 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-10 16:47
New changeset 7854012077009b9f364f198a8ae38b546ec58313 by Victor Stinner in branch 'main':
bpo-46917: math.nan is now always available (GH-31793)
https://github.com/python/cpython/commit/7854012077009b9f364f198a8ae38b546ec58313
msg414865 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-10 16:53
> bpo-46917: math.nan is now always available (GH-31793)

Technically, it was already the case in practice: see bpo-46656 for the rationale and the history of Py_NAN.
msg414866 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2022-03-10 16:56
> Remove code handling missing NAN and infinity: float("nan"), float("inf"), math.nan and math.inf are always available.

The code to support missing NaN was already removed by:

New changeset 1b2611eb0283055835e5df632a7a735db8c894b8 by Victor Stinner in branch 'main':
bpo-46656: Remove Py_NO_NAN macro (GH-31160)
https://github.com/python/cpython/commit/1b2611eb0283055835e5df632a7a735db8c894b8

In fact, math.inf is already always available in Python 3.10 and older. There was no "#ifdef" for missing infinity support. In Python 3.10, math.inf is implemented as:

static double
m_inf(void)
{
#ifndef PY_NO_SHORT_FLOAT_REPR
    return _Py_dg_infinity(0);
#else
    return Py_HUGE_VAL;
#endif
}
History
Date User Action Args
2022-04-11 14:59:56adminsetgithub: 91073
2022-03-10 16:56:24vstinnersetmessages: + msg414866
2022-03-10 16:53:43vstinnersetmessages: + msg414865
2022-03-10 16:47:26vstinnersetmessages: + msg414863
2022-03-10 16:46:43vstinnersetmessages: + msg414862
2022-03-10 13:47:45vstinnersetpull_requests: + pull_request29897
2022-03-10 13:37:47vstinnersetmessages: + msg414847
2022-03-10 08:37:26vstinnersetkeywords: + patch
stage: patch review
pull_requests: + pull_request29894
2022-03-05 11:54:58mark.dickinsonsetmessages: + msg414575
2022-03-03 22:40:19vstinnersetnosy: + mark.dickinson
2022-03-03 22:39:43vstinnercreate