math.tanpi is singular at every odd half-integer, and m_tanpi in Modules/mathmodule.c has an explicit branch for that case, but nothing exercises it. None of the 279 tanpi rows in Lib/test/mathdata/math_testcases.txt has a half-integer argument, and Lib/test/test_math.py never names tanpi.
Adding a row for it does not work as written, because the flag that describes this case makes test_mtestfile fail:
The header of math_testcases.txt defines divide-by-zero as "raised when a finite input gives a mathematically infinite result", which is what happens at the pole, and test_mtestfile maps that flag to ValueError, while math.tanpi(0.5) raises OverflowError. The other flag, overflow, passes, but the same header defines it as "raised when a finite input gives a finite result that is too large to fit in the usual range of an IEEE 754 double", so the row would record something the file says is false.
Doc/library/math.rst does not mention the poles either.
Expected: math.tanpi at an odd half-integer is covered by a test, with a flag that matches the file's own definitions.
It's a pole error, just like log(0.0) or gamma(-1.0).
That second example was a bad example, FWIW. gamma's handling of the poles at negative integers is weird in C99 (and later versions of the standard). gamma(0.0) is treated as a pole, but gamma(-1.0) is treated as invalid instead, for reasons that presumably made sense at the time but look a bit questionable now. Doesn't matter for Python, since both divide-by-zero and invalid are mapped to ValueError.
Activity
mdickinson commented on Aug 17, 2026
math.tanpi(0.5) should definitely raise ValueError, not OverflowError. It's a pole error, just like log(0.0) or gamma(-1.0).
It's slated for Python 3.16, right? Not 3.15? So there's a decent window to fix it.
@jepler @picnixz
mdickinson commented on Aug 17, 2026
FWIW, the rules are set out clearly at the top of the math module: https://github.com/python/cpython/blame/a7bb524fef61f77ede01f660ffbd591e1d5837ce/Modules/mathmodule.c#L11-L41
jepler commented on Aug 17, 2026
Thanks. It's my oversight that the suite of test values I took did not test the half integers and I did not notice this fact.
mdickinson commented on Aug 18, 2026
That second example was a bad example, FWIW. gamma's handling of the poles at negative integers is weird in C99 (and later versions of the standard). gamma(0.0) is treated as a pole, but gamma(-1.0) is treated as invalid instead, for reasons that presumably made sense at the time but look a bit questionable now. Doesn't matter for Python, since both divide-by-zero and invalid are mapped to ValueError.
gh-155966: Correct handling of `math.tanpi` poles (#155980)
Merge branch 'main' into tachyon-native-callable
pythongh-155966: Correct handling of `math.tanpi` poles (python#155980)
pythongh-155966: Correct handling of `math.tanpi` poles (python#155980)