-
-
Notifications
You must be signed in to change notification settings - Fork 33.7k
Description
Feature or enhancement
Proposal:
With #29179, many workarounds for buggy libm implementations were removed. Yet, there is m_atan2():
Lines 546 to 572 in d0b92dd
| 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); | |
| } |
and
Lines 329 to 355 in d0b92dd
| 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); | |
| } |
They are identical, the second one just uses Py_complex to keep arguments.
We should either 1) move first helper to _math.h and reuse it in the cmathmodule.c or 2) just remove these helpers. I'll provide patch for 1) proposal.
But 2) looks also safe for me: it seems that c_atan2() helper was used only for cmath.phase() and cmath.polar(); libm's atan2() used for the rest - and this don't poses any problems in CI or build bots. ("Problem" values are tested, e.g. infinities and nans for acos().)
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response