diff options
author | Yoctopuce dev <dev@yoctopuce.com> | 2025-06-19 15:47:13 +0200 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2025-06-24 00:30:08 +1000 |
commit | e57aa7e70a326659529d02891abb9a57b055fc0c (patch) | |
tree | 699f53a51d4defd79c0f16bad3b231cc515f0b36 /tests/float/float_array.py | |
parent | 66c01480226aaf880a9d6e88340772bd53bc0421 (diff) | |
download | micropython-e57aa7e70a326659529d02891abb9a57b055fc0c.tar.gz micropython-e57aa7e70a326659529d02891abb9a57b055fc0c.zip |
py/obj: Fix nan handling in object REPR_C and REPR_D.
CPython math.nan is positive with regards to copysign. The signaling bit
(aka sign flag) was incorrectly set.
In addition, REPR_C and REPR_D should only use the _true_ nan to prevent
system crash in case of hand-crafted floats. For instance, with REPR_C,
any nan-like float following the pattern
`01111111 1xxxxxxx xxxxxxxx xxxxx1xx` would be switched to an immediate
object or a qstr string. When the qstr index is too large, this would
cause a crash.
This commit fixes the issue, and adds the relevant test cases.
Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
Diffstat (limited to 'tests/float/float_array.py')
-rw-r--r-- | tests/float/float_array.py | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/tests/float/float_array.py b/tests/float/float_array.py index 3d128da838..cfff3b220c 100644 --- a/tests/float/float_array.py +++ b/tests/float/float_array.py @@ -19,4 +19,10 @@ def test(a): test(array("f")) test(array("d")) -print("{:.4f}".format(array("f", bytes(array("I", [0x3DCCCCCC])))[0])) +# hand-crafted floats, including non-standard nan +for float_hex in (0x3DCCCCCC, 0x7F800024, 0x7FC00004): + f = array("f", bytes(array("I", [float_hex])))[0] + if type(f) is float: + print("{:.4e}".format(f)) + else: + print(f) |