From 886d4ac099b95d2c269387f00b9e4493ebeefbf6 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 17:26:07 -0500 Subject: [PATCH 1/8] gh-155966: Correct handling of tanpi(0.5) (#155966) As pointed out in the issue, the exceptional half-integer (0.5, 1.5, etc) inputs of tanpi were not handled properly. Now, these raise ValueError and this is tested by `test.test_math` through its list of test cases. --- Lib/test/mathdata/math_testcases.txt | 5 +++++ Modules/mathmodule.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/mathdata/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt index 4a38a3666bab208..6cd292e3bf6fc45 100644 --- a/Lib/test/mathdata/math_testcases.txt +++ b/Lib/test/mathdata/math_testcases.txt @@ -2247,3 +2247,8 @@ tanpi10275 tanpi -1.6591963470121216 -> 1.829921944286168 tanpi20001 tanpi inf -> nan invalid tanpi20002 tanpi -inf -> nan invalid tanpi20003 tanpi nan -> nan + +tanpi30050 tanpi 0.5 -> inf invalid +tanpi30055 tanpi -0.5 -> inf invalid +tanpi30115 tanpi 1.5 -> inf invalid +tanpi30118 tanpi -1.5 -> inf invalid diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index eaa1850b8aee1ac..8c05c1c02010088 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1343,10 +1343,10 @@ FUNC1D(tan, tan, 0, FUNC1(tanh, tanh, 0, "tanh($module, x, /)\n--\n\n" "Return the hyperbolic tangent of x.") -FUNC1D(tanpi, m_tanpi, 1, +FUNC1D(tanpi, m_tanpi, 0, "tanpi($module, x, /)\n--\n\n" "Return the tangent of x (measured in half-turns).", - "expected a finite input, got %s") + "expected a finite input not equal to a half-integer, got %s") /* Precision summation function as msum() by Raymond Hettinger in , From faa179949c4649a2c2ae863756fc34bcccf04a0a Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 17:26:27 -0500 Subject: [PATCH 2/8] math_testcases: Fix duplicate test ids --- Lib/test/mathdata/math_testcases.txt | 54 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Lib/test/mathdata/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt index 6cd292e3bf6fc45..a5a0b2945f6f01e 100644 --- a/Lib/test/mathdata/math_testcases.txt +++ b/Lib/test/mathdata/math_testcases.txt @@ -1311,45 +1311,45 @@ atan2pi20000 atan2pi inf 0 -> 0.5 atan2pi20001 atan2pi -inf 0 -> -0.5 atan2pi20002 atan2pi nan 0 -> nan -atan2pi20000 atan2pi inf -0 -> 0.5 -atan2pi20001 atan2pi -inf -0 -> -0.5 -atan2pi20002 atan2pi nan -0 -> nan +atan2pi21000 atan2pi inf -0 -> 0.5 +atan2pi21001 atan2pi -inf -0 -> -0.5 +atan2pi21002 atan2pi nan -0 -> nan -atan2pi20003 atan2pi inf 1 -> 0.5 -atan2pi20004 atan2pi -inf 1 -> -0.5 -atan2pi20005 atan2pi nan 1 -> nan +atan2pi22003 atan2pi inf 1 -> 0.5 +atan2pi22004 atan2pi -inf 1 -> -0.5 +atan2pi22005 atan2pi nan 1 -> nan -atan2pi20006 atan2pi inf -1 -> 0.5 -atan2pi20007 atan2pi -inf -1 -> -0.5 -atan2pi20008 atan2pi nan -1 -> nan +atan2pi23006 atan2pi inf -1 -> 0.5 +atan2pi23007 atan2pi -inf -1 -> -0.5 +atan2pi23008 atan2pi nan -1 -> nan -atan2pi20009 atan2pi inf inf -> 0.25 -atan2pi20010 atan2pi -inf inf -> -0.25 -atan2pi20011 atan2pi nan inf -> nan +atan2pi24009 atan2pi inf inf -> 0.25 +atan2pi24010 atan2pi -inf inf -> -0.25 +atan2pi24011 atan2pi nan inf -> nan -atan2pi20012 atan2pi inf -inf -> .75 -atan2pi20013 atan2pi -inf -inf -> -.75 -atan2pi20014 atan2pi nan -inf -> nan +atan2pi25012 atan2pi inf -inf -> .75 +atan2pi25013 atan2pi -inf -inf -> -.75 +atan2pi25014 atan2pi nan -inf -> nan -atan2pi20015 atan2pi inf nan -> nan -atan2pi20016 atan2pi -inf nan -> nan -atan2pi20017 atan2pi nan nan -> nan +atan2pi26015 atan2pi inf nan -> nan +atan2pi26016 atan2pi -inf nan -> nan +atan2pi26017 atan2pi nan nan -> nan atan2pi30000 atan2pi 0 inf -> 0.0 atan2pi30001 atan2pi 0 -inf -> 1.0 atan2pi30002 atan2pi 0 nan -> nan -atan2pi30000 atan2pi -0 inf -> -0.0 -atan2pi30001 atan2pi -0 -inf -> -1.0 -atan2pi30002 atan2pi -0 nan -> nan +atan2pi31000 atan2pi -0 inf -> -0.0 +atan2pi31001 atan2pi -0 -inf -> -1.0 +atan2pi31002 atan2pi -0 nan -> nan -atan2pi30003 atan2pi 1 inf -> 0.0 -atan2pi30004 atan2pi 1 -inf -> 1.0 -atan2pi30005 atan2pi 1 nan -> nan +atan2pi32003 atan2pi 1 inf -> 0.0 +atan2pi32004 atan2pi 1 -inf -> 1.0 +atan2pi32005 atan2pi 1 nan -> nan -atan2pi30006 atan2pi -1 inf -> -0.0 -atan2pi30007 atan2pi -1 -inf -> -1.0 -atan2pi30008 atan2pi -1 nan -> nan +atan2pi33006 atan2pi -1 inf -> -0.0 +atan2pi33007 atan2pi -1 -inf -> -1.0 +atan2pi33008 atan2pi -1 nan -> nan ----------- -- cospi -- From 198937d95e8844c36cbc8169c35b122afcecbe9e Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 17:26:37 -0500 Subject: [PATCH 3/8] test_math: Treat duplicate test ids as failure. --- Lib/test/test_math.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index a27996dd01c9d12..a1250c668223e7f 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -2144,7 +2144,12 @@ def test_mtestfile(self): fail_fmt = "{}: {}{!r}: {}" failures = [] + ids = set() for id, fn, args, expected, flags in parse_mtestfile(math_testcases): + if id in ids: + failures.append(f"Duplicate test id {id}") + ids.add(id) + func = getattr(math, fn) if 'invalid' in flags or 'divide-by-zero' in flags: From 5bd16b90e311304ed579e64dbe8a9f6dccd7d68f Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 17:39:47 -0500 Subject: [PATCH 4/8] Add news entry --- .../next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst diff --git a/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst b/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst new file mode 100644 index 000000000000000..8bdcfb8b3abeaad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst @@ -0,0 +1,2 @@ +:func:`math.atanpi` now raises :exc:`ValueError` for half-integer values +(e.g., ``atanpi(1.5)``), as these are poles of the function. From e59375bdc26a430bc38ddb0e5e67a189b35840f0 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 20:04:07 -0500 Subject: [PATCH 5/8] Update Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst Co-authored-by: Sergey B Kirpichev --- .../Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst b/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst index 8bdcfb8b3abeaad..2f556aef54a63a0 100644 --- a/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst +++ b/Misc/NEWS.d/next/Library/2026-08-17-17-39-41.gh-issue-155966.0YOADY.rst @@ -1,2 +1,2 @@ -:func:`math.atanpi` now raises :exc:`ValueError` for half-integer values -(e.g., ``atanpi(1.5)``), as these are poles of the function. +:func:`math.tanpi` now raises :exc:`ValueError` for half-integer values +(e.g., ``tanpi(1.5)``), as these are poles of the function. From 9dff17a389c8c6de7c1568228cf4c930c96ddf33 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 20:29:44 -0500 Subject: [PATCH 6/8] fix sign of infinity in test cases the test harness cannot verify the sign of infinity, it can only verify the exception; but it's good for it to be correct anyhow. --- Lib/test/mathdata/math_testcases.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/mathdata/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt index a5a0b2945f6f01e..87dfbed338dc6a7 100644 --- a/Lib/test/mathdata/math_testcases.txt +++ b/Lib/test/mathdata/math_testcases.txt @@ -2248,7 +2248,7 @@ tanpi20001 tanpi inf -> nan invalid tanpi20002 tanpi -inf -> nan invalid tanpi20003 tanpi nan -> nan -tanpi30050 tanpi 0.5 -> inf invalid -tanpi30055 tanpi -0.5 -> inf invalid -tanpi30115 tanpi 1.5 -> inf invalid -tanpi30118 tanpi -1.5 -> inf invalid +tanpi30001 tanpi 0.5 -> inf invalid +tanpi30002 tanpi -0.5 -> -inf invalid +tanpi30003 tanpi 1.5 -> -inf invalid +tanpi30004 tanpi -1.5 -> inf invalid From b4b4484d9d01961d0fb80915d35be935f8160340 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 20:39:53 -0500 Subject: [PATCH 7/8] Revert "math_testcases: Fix duplicate test ids" This reverts commit faa179949c4649a2c2ae863756fc34bcccf04a0a. --- Lib/test/mathdata/math_testcases.txt | 54 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Lib/test/mathdata/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt index 87dfbed338dc6a7..d2242f62e014c32 100644 --- a/Lib/test/mathdata/math_testcases.txt +++ b/Lib/test/mathdata/math_testcases.txt @@ -1311,45 +1311,45 @@ atan2pi20000 atan2pi inf 0 -> 0.5 atan2pi20001 atan2pi -inf 0 -> -0.5 atan2pi20002 atan2pi nan 0 -> nan -atan2pi21000 atan2pi inf -0 -> 0.5 -atan2pi21001 atan2pi -inf -0 -> -0.5 -atan2pi21002 atan2pi nan -0 -> nan +atan2pi20000 atan2pi inf -0 -> 0.5 +atan2pi20001 atan2pi -inf -0 -> -0.5 +atan2pi20002 atan2pi nan -0 -> nan -atan2pi22003 atan2pi inf 1 -> 0.5 -atan2pi22004 atan2pi -inf 1 -> -0.5 -atan2pi22005 atan2pi nan 1 -> nan +atan2pi20003 atan2pi inf 1 -> 0.5 +atan2pi20004 atan2pi -inf 1 -> -0.5 +atan2pi20005 atan2pi nan 1 -> nan -atan2pi23006 atan2pi inf -1 -> 0.5 -atan2pi23007 atan2pi -inf -1 -> -0.5 -atan2pi23008 atan2pi nan -1 -> nan +atan2pi20006 atan2pi inf -1 -> 0.5 +atan2pi20007 atan2pi -inf -1 -> -0.5 +atan2pi20008 atan2pi nan -1 -> nan -atan2pi24009 atan2pi inf inf -> 0.25 -atan2pi24010 atan2pi -inf inf -> -0.25 -atan2pi24011 atan2pi nan inf -> nan +atan2pi20009 atan2pi inf inf -> 0.25 +atan2pi20010 atan2pi -inf inf -> -0.25 +atan2pi20011 atan2pi nan inf -> nan -atan2pi25012 atan2pi inf -inf -> .75 -atan2pi25013 atan2pi -inf -inf -> -.75 -atan2pi25014 atan2pi nan -inf -> nan +atan2pi20012 atan2pi inf -inf -> .75 +atan2pi20013 atan2pi -inf -inf -> -.75 +atan2pi20014 atan2pi nan -inf -> nan -atan2pi26015 atan2pi inf nan -> nan -atan2pi26016 atan2pi -inf nan -> nan -atan2pi26017 atan2pi nan nan -> nan +atan2pi20015 atan2pi inf nan -> nan +atan2pi20016 atan2pi -inf nan -> nan +atan2pi20017 atan2pi nan nan -> nan atan2pi30000 atan2pi 0 inf -> 0.0 atan2pi30001 atan2pi 0 -inf -> 1.0 atan2pi30002 atan2pi 0 nan -> nan -atan2pi31000 atan2pi -0 inf -> -0.0 -atan2pi31001 atan2pi -0 -inf -> -1.0 -atan2pi31002 atan2pi -0 nan -> nan +atan2pi30000 atan2pi -0 inf -> -0.0 +atan2pi30001 atan2pi -0 -inf -> -1.0 +atan2pi30002 atan2pi -0 nan -> nan -atan2pi32003 atan2pi 1 inf -> 0.0 -atan2pi32004 atan2pi 1 -inf -> 1.0 -atan2pi32005 atan2pi 1 nan -> nan +atan2pi30003 atan2pi 1 inf -> 0.0 +atan2pi30004 atan2pi 1 -inf -> 1.0 +atan2pi30005 atan2pi 1 nan -> nan -atan2pi33006 atan2pi -1 inf -> -0.0 -atan2pi33007 atan2pi -1 -inf -> -1.0 -atan2pi33008 atan2pi -1 nan -> nan +atan2pi30006 atan2pi -1 inf -> -0.0 +atan2pi30007 atan2pi -1 -inf -> -1.0 +atan2pi30008 atan2pi -1 nan -> nan ----------- -- cospi -- From 38f4d61bca9d99eab6b93e886d1b8767e16b70e9 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 17 Aug 2026 20:40:47 -0500 Subject: [PATCH 8/8] fix only minimal set of testcase IDs --- Lib/test/mathdata/math_testcases.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/mathdata/math_testcases.txt b/Lib/test/mathdata/math_testcases.txt index d2242f62e014c32..843766673afef9f 100644 --- a/Lib/test/mathdata/math_testcases.txt +++ b/Lib/test/mathdata/math_testcases.txt @@ -1311,9 +1311,9 @@ atan2pi20000 atan2pi inf 0 -> 0.5 atan2pi20001 atan2pi -inf 0 -> -0.5 atan2pi20002 atan2pi nan 0 -> nan -atan2pi20000 atan2pi inf -0 -> 0.5 -atan2pi20001 atan2pi -inf -0 -> -0.5 -atan2pi20002 atan2pi nan -0 -> nan +atan2pi21000 atan2pi inf -0 -> 0.5 +atan2pi21001 atan2pi -inf -0 -> -0.5 +atan2pi21002 atan2pi nan -0 -> nan atan2pi20003 atan2pi inf 1 -> 0.5 atan2pi20004 atan2pi -inf 1 -> -0.5 @@ -1339,9 +1339,9 @@ atan2pi30000 atan2pi 0 inf -> 0.0 atan2pi30001 atan2pi 0 -inf -> 1.0 atan2pi30002 atan2pi 0 nan -> nan -atan2pi30000 atan2pi -0 inf -> -0.0 -atan2pi30001 atan2pi -0 -inf -> -1.0 -atan2pi30002 atan2pi -0 nan -> nan +atan2pi31000 atan2pi -0 inf -> -0.0 +atan2pi31001 atan2pi -0 -inf -> -1.0 +atan2pi31002 atan2pi -0 nan -> nan atan2pi30003 atan2pi 1 inf -> 0.0 atan2pi30004 atan2pi 1 -inf -> 1.0