https://github.com/python/cpython/commit/5b5ffce05c211a5b0b74cd95eeb4c463614ee136
commit: 5b5ffce05c211a5b0b74cd95eeb4c463614ee136
branch: main
author: Sergey B Kirpichev <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-05-31T07:29:44Z
summary:
Correct frexp() docs for zero and non-finite numbers (GH-149753)
0.5 <= abs(m) < 1 is only true for finite nonzero numbers
files:
M Doc/library/math.rst
M Modules/clinic/mathmodule.c.h
M Modules/mathmodule.c
diff --git a/Doc/library/math.rst b/Doc/library/math.rst
index 9cc8c5d6886324c..41a9a0ab55d8fab 100644
--- a/Doc/library/math.rst
+++ b/Doc/library/math.rst
@@ -255,10 +255,12 @@ Floating point manipulation functions
.. function:: frexp(x)
- Return the mantissa and exponent of *x* as the pair ``(m, e)``. *m* is a
float
- and *e* is an integer such that ``x == m * 2**e`` exactly. If *x* is zero,
- returns ``(0.0, 0)``, otherwise ``0.5 <= abs(m) < 1``. This is used to
"pick
- apart" the internal representation of a float in a portable way.
+ Return the mantissa and exponent of *x* as the pair ``(m, e)``.
+ If *x* is a finite nonzero number, then *m* is a float with
+ ``0.5 <= abs(m) < 1.0`` and an integer *e* is such that
+ ``x == m * 2**e`` exactly. Else, return ``(x, 0)``.
+ This is used to "pick apart" the internal representation of
+ a float in a portable way.
Note that :func:`frexp` has a different call/return pattern
than its C equivalents: it takes a single argument and return a pair of
diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h
index 6a1b1a45d1d93a0..a5e583c180defee 100644
--- a/Modules/clinic/mathmodule.c.h
+++ b/Modules/clinic/mathmodule.c.h
@@ -198,8 +198,9 @@ PyDoc_STRVAR(math_frexp__doc__,
"\n"
"Return the mantissa and exponent of x, as pair (m, e).\n"
"\n"
-"m is a float and e is an int, such that x = m * 2.**e.\n"
-"If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
+"If x is a finite nonzero number, then m is a float with\n"
+"0.5 <= abs(m) < 1.0 and an integer e is such that\n"
+"x == m * 2**e exactly. Else, return (x, 0).");
#define MATH_FREXP_METHODDEF \
{"frexp", (PyCFunction)math_frexp, METH_O, math_frexp__doc__},
@@ -1163,4 +1164,4 @@ math_ulp(PyObject *module, PyObject *arg)
exit:
return return_value;
}
-/*[clinic end generated code: output=80c666aef8d2df36 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3452ce8caa2d1bd7 input=a9049054013a1b77]*/
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index a7616ad70e4afed..5636a00afe10c4b 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -1438,13 +1438,14 @@ math.frexp
Return the mantissa and exponent of x, as pair (m, e).
-m is a float and e is an int, such that x = m * 2.**e.
-If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.
+If x is a finite nonzero number, then m is a float with
+0.5 <= abs(m) < 1.0 and an integer e is such that
+x == m * 2**e exactly. Else, return (x, 0).
[clinic start generated code]*/
static PyObject *
math_frexp_impl(PyObject *module, double x)
-/*[clinic end generated code: output=03e30d252a15ad4a input=96251c9e208bc6e9]*/
+/*[clinic end generated code: output=03e30d252a15ad4a input=215cf8ea28a0959b]*/
{
int i;
/* deal with special cases directly, to sidestep platform
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]