Skip to content

gh-154568: Fix array._array_reconstructor() ignoring requested byte order for float16#154569

Open
PhysicistJohn wants to merge 3 commits into
python:mainfrom
PhysicistJohn:gh-154568-float16-reconstructor-endian-fix
Open

gh-154568: Fix array._array_reconstructor() ignoring requested byte order for float16#154569
PhysicistJohn wants to merge 3 commits into
python:mainfrom
PhysicistJohn:gh-154568-float16-reconstructor-endian-fix

Conversation

@PhysicistJohn

Copy link
Copy Markdown

The slow-path decoder for IEEE_754_FLOAT16_LE/BE compared mformat_code
against IEEE_754_FLOAT_LE (the 32-bit float constant) instead of
IEEE_754_FLOAT16_LE, so it always decoded as big-endian regardless of
what was requested. Fixes gh-154568.

Adds a regression test. A real 'e'-typecode array only exercises the
slow/converting path when the requested mformat disagrees with the
machine's native float16 format, so which direction (LE/BE) actually
exercises the buggy branch depends on the test machine's endianness --
and the other direction happens to come out "correct" by coincidence,
since the bug unconditionally decodes as big-endian. The test uses a
typecode ('d') whose native format can never match the float16 codes,
which forces the slow path deterministically on any machine so both
directions are actually exercised.

…byte order for float16

The slow-path decoder for IEEE_754_FLOAT16_LE/BE computed the
byte-order flag by comparing mformat_code against IEEE_754_FLOAT_LE
(the 32-bit float constant) instead of IEEE_754_FLOAT16_LE. Since the
float16 mformat codes are never equal to that constant, the comparison
was always false, so the decoder always treated input as big-endian
regardless of what was requested.

Adds a regression test. A real 'e'-typecode array only exercises the
slow/converting path when the requested mformat disagrees with the
machine's native float16 format, so which direction (LE/BE) exercises
the buggy branch depends on the test machine's endianness, and the
other direction happens to come out "correct" by coincidence since the
bug unconditionally decodes as big-endian. The test uses a typecode
('d') whose native format can never match the float16 codes, forcing
the slow path deterministically on any machine.
@python-cla-bot

This comment was marked as resolved.

…ction

array._array_reconstructor is internal/private and has no Sphinx docs
entry, so the :func: cross-reference role can't resolve and trips the
docs CI's new-NEWS-nit check.
@skirpichev
skirpichev self-requested a review July 24, 2026 03:12
skirpichev

This comment was marked as outdated.

Comment thread Lib/test/test_array.py
msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))

def test_float16_endianness(self):
# gh-issue: the slow-path decoder for IEEE_754_FLOAT16_LE/BE

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.

Suggested change
# gh-issue: the slow-path decoder for IEEE_754_FLOAT16_LE/BE
# gh-154568: the slow-path decoder for IEEE_754_FLOAT16_LE/BE

Second thought, I think this test is fine. Just please add half-floats case to the test_numbers().

@skirpichev
skirpichev requested a review from vstinner July 24, 2026 05:49
@skirpichev skirpichev added the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Jul 24, 2026
@skirpichev

Copy link
Copy Markdown
Member

CC @vstinner

…lify NEWS wording

Per skirpichev's review on pythonGH-154569:
- Add a float16 (LE/BE) case to ArrayReconstructorTest.test_numbers()
  for basic functional coverage alongside the other numeric types,
  complementing the existing dedicated test_float16_endianness (which
  he confirmed is fine to keep for deterministically forcing the
  buggy slow path regardless of test-machine endianness).
- Simplify the NEWS entry wording per his suggested rewrite.
@PhysicistJohn

Copy link
Copy Markdown
Author

Thanks for the review! Pushed both changes: added a half-floats case to
test_numbers() alongside the other numeric types, and simplified the
NEWS wording per your suggestion.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting core review needs backport to 3.15 pre-release feature fixes, bugs and security fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

array._array_reconstructor() ignores requested byte order for float16 (IEEE_754_FLOAT16_LE/BE)

2 participants