From dc453f6f9edc917536cf5cc7d38ea70e909f9028 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Mon, 5 Aug 2024 08:35:46 +0300 Subject: [PATCH 1/4] gh-122681: merge m_atan2() and c_atan2() helper functions --- ...-08-05-10-52-51.gh-issue-122681.q0T58t.rst | 2 + Modules/_math.h | 39 +++++++++++++++++++ Modules/cmathmodule.c | 34 +--------------- Modules/mathmodule.c | 37 ------------------ 4 files changed, 43 insertions(+), 69 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst diff --git a/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst b/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst new file mode 100644 index 00000000000000..b8d4fa21846786 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst @@ -0,0 +1,2 @@ +Merge ``m_atan2()`` and ``c_atan2()`` helper function, move to +``Modules/_math.h``. diff --git a/Modules/_math.h b/Modules/_math.h index 2285b64747c0bd..b8477d2752b7cc 100644 --- a/Modules/_math.h +++ b/Modules/_math.h @@ -23,3 +23,42 @@ _Py_log1p(double x) } #define m_log1p _Py_log1p + +/* + wrapper for atan2 that deals directly with special cases before + delegating to the platform libm for the remaining cases. This + is necessary to get consistent behaviour across platforms. + Windows, FreeBSD and alpha Tru64 are amongst platforms that don't + always follow C99. Windows screws up atan2 for inf and nan, and + alpha Tru64 5.1 doesn't follow C99 for atan2(0., 0.). +*/ + +static double +_Py_atan2(double y, double x) +{ + if (isnan(x) || isnan(y)) + return Py_NAN; + if (isinf(y)) { + if (isinf(x)) { + if (copysign(1., x) == 1.) + /* atan2(+-inf, +inf) == +-pi/4 */ + return copysign(0.25*Py_MATH_PI, y); + else + /* atan2(+-inf, -inf) == +-pi*3/4 */ + return copysign(0.75*Py_MATH_PI, y); + } + /* atan2(+-inf, x) == +-pi/2 for finite x */ + return copysign(0.5*Py_MATH_PI, y); + } + if (isinf(x) || y == 0.) { + if (copysign(1., x) == 1.) + /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */ + return copysign(0., y); + else + /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */ + return copysign(Py_MATH_PI, y); + } + return atan2(y, x); +} + +#define m_atan2 _Py_atan2 diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 3c7f0bb6453ef0..71686518d84aa7 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -324,36 +324,6 @@ cmath_atan_impl(PyObject *module, Py_complex z) return r; } -/* Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't follow - C99 for atan2(0., 0.). */ -static double -c_atan2(Py_complex z) -{ - if (isnan(z.real) || isnan(z.imag)) - return Py_NAN; - if (isinf(z.imag)) { - if (isinf(z.real)) { - if (copysign(1., z.real) == 1.) - /* atan2(+-inf, +inf) == +-pi/4 */ - return copysign(0.25*Py_MATH_PI, z.imag); - else - /* atan2(+-inf, -inf) == +-pi*3/4 */ - return copysign(0.75*Py_MATH_PI, z.imag); - } - /* atan2(+-inf, x) == +-pi/2 for finite x */ - return copysign(0.5*Py_MATH_PI, z.imag); - } - if (isinf(z.real) || z.imag == 0.) { - if (copysign(1., z.real) == 1.) - /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */ - return copysign(0., z.imag); - else - /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */ - return copysign(Py_MATH_PI, z.imag); - } - return atan2(z.imag, z.real); -} - static Py_complex atanh_special_values[7][7]; @@ -966,7 +936,7 @@ cmath_phase_impl(PyObject *module, Py_complex z) double phi; errno = 0; - phi = c_atan2(z); /* should not cause any exception */ + phi = m_atan2(z.imag, z.real); /* should not cause any exception */ if (errno != 0) return math_error(); else @@ -991,7 +961,7 @@ cmath_polar_impl(PyObject *module, Py_complex z) double r, phi; errno = 0; - phi = c_atan2(z); /* should not cause any exception */ + phi = m_atan2(z.imag, z.real); /* should not cause any exception */ r = _Py_c_abs(z); /* sets errno to ERANGE on overflow */ if (errno != 0) return math_error(); diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 64dfceac8bfea3..d6d0702169e186 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -535,43 +535,6 @@ m_lgamma(double x) return r; } -/* - wrapper for atan2 that deals directly with special cases before - delegating to the platform libm for the remaining cases. This - is necessary to get consistent behaviour across platforms. - Windows, FreeBSD and alpha Tru64 are amongst platforms that don't - always follow C99. -*/ - -static double -m_atan2(double y, double x) -{ - if (isnan(x) || isnan(y)) - return Py_NAN; - if (isinf(y)) { - if (isinf(x)) { - if (copysign(1., x) == 1.) - /* atan2(+-inf, +inf) == +-pi/4 */ - return copysign(0.25*Py_MATH_PI, y); - else - /* atan2(+-inf, -inf) == +-pi*3/4 */ - return copysign(0.75*Py_MATH_PI, y); - } - /* atan2(+-inf, x) == +-pi/2 for finite x */ - return copysign(0.5*Py_MATH_PI, y); - } - if (isinf(x) || y == 0.) { - if (copysign(1., x) == 1.) - /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */ - return copysign(0., y); - else - /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */ - return copysign(Py_MATH_PI, y); - } - return atan2(y, x); -} - - /* IEEE 754-style remainder operation: x - n*y where n*y is the nearest multiple of y to x, taking n even in the case of a tie. Assuming an IEEE 754 binary floating-point format, the result is always exact. */ From 128281b9ca35ad9f317da9a410f07bbe2966cfdf Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Mon, 5 Aug 2024 12:01:54 +0300 Subject: [PATCH 2/4] XXX pin attrs --- Tools/requirements-hypothesis.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt index ab3f39ac6ee087..a40cfb28e1c039 100644 --- a/Tools/requirements-hypothesis.txt +++ b/Tools/requirements-hypothesis.txt @@ -1,4 +1,5 @@ # Requirements file for hypothesis that # we use to run our property-based tests in CI. +attrs<=23.2.0 hypothesis==6.104.2 From 6a11322494b1ca667f57cdd5b339d1a72efdda09 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Tue, 6 Aug 2024 05:51:52 +0300 Subject: [PATCH 3/4] Revert "XXX pin attrs" This reverts commit 128281b9ca35ad9f317da9a410f07bbe2966cfdf. --- Tools/requirements-hypothesis.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt index a40cfb28e1c039..ab3f39ac6ee087 100644 --- a/Tools/requirements-hypothesis.txt +++ b/Tools/requirements-hypothesis.txt @@ -1,5 +1,4 @@ # Requirements file for hypothesis that # we use to run our property-based tests in CI. -attrs<=23.2.0 hypothesis==6.104.2 From 128023cb3f8eea877c458fe0614aa26c71c4b1f8 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Tue, 6 Aug 2024 05:55:32 +0300 Subject: [PATCH 4/4] revert news entry too --- .../next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst diff --git a/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst b/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst deleted file mode 100644 index b8d4fa21846786..00000000000000 --- a/Misc/NEWS.d/next/Library/2024-08-05-10-52-51.gh-issue-122681.q0T58t.rst +++ /dev/null @@ -1,2 +0,0 @@ -Merge ``m_atan2()`` and ``c_atan2()`` helper function, move to -``Modules/_math.h``.