summaryrefslogtreecommitdiffstatshomepage
path: root/py/modmath.c
diff options
context:
space:
mode:
authorYoctopuce dev <dev@yoctopuce.com>2025-06-19 15:47:13 +0200
committerDamien George <damien@micropython.org>2025-06-24 00:30:08 +1000
commite57aa7e70a326659529d02891abb9a57b055fc0c (patch)
tree699f53a51d4defd79c0f16bad3b231cc515f0b36 /py/modmath.c
parent66c01480226aaf880a9d6e88340772bd53bc0421 (diff)
downloadmicropython-e57aa7e70a326659529d02891abb9a57b055fc0c.tar.gz
micropython-e57aa7e70a326659529d02891abb9a57b055fc0c.zip
py/obj: Fix nan handling in object REPR_C and REPR_D.HEADmaster
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 'py/modmath.c')
-rw-r--r--py/modmath.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/py/modmath.c b/py/modmath.c
index b792d8581d..919a8ccd9d 100644
--- a/py/modmath.c
+++ b/py/modmath.c
@@ -161,6 +161,11 @@ MATH_FUN_2(atan2, atan2)
MATH_FUN_1_TO_INT(ceil, ceil)
// copysign(x, y)
static mp_float_t MICROPY_FLOAT_C_FUN(copysign_func)(mp_float_t x, mp_float_t y) {
+ #if MICROPY_PY_MATH_COPYSIGN_FIX_NAN
+ if (isnan(y)) {
+ y = 0.0;
+ }
+ #endif
return MICROPY_FLOAT_C_FUN(copysign)(x, y);
}
MATH_FUN_2(copysign, copysign_func)