mirror of https://github.com/python/cpython
Patch #453627: Define the following macros when compiling on a UnixWare 7.x system:
SCO_ATAN2_BUG, SCO_ACCEPT_BUG, and STRICT_SYSV_CURSES. Work aroudn a bug in the SCO UnixWare atan2() implementation.
This commit is contained in:
parent
0ace326ed2
commit
655c9557f6
|
@ -21,6 +21,22 @@
|
|||
#define M_PI (3.141592653589793239)
|
||||
#endif
|
||||
|
||||
#ifdef SCO_ATAN2_BUG
|
||||
/*
|
||||
* UnixWare 7+ is known to have a bug in atan2 that will return PI instead
|
||||
* of ZERO (0) if the first argument is ZERO(0).
|
||||
*/
|
||||
static double atan2_sco(double x, double y)
|
||||
{
|
||||
if (x == 0.0)
|
||||
return (double)0.0;
|
||||
return atan2(x, y);
|
||||
}
|
||||
#define ATAN2 atan2_sco
|
||||
#else
|
||||
#define ATAN2 atan2
|
||||
#endif
|
||||
|
||||
/* First, the C functions that do the real work */
|
||||
|
||||
/* constants */
|
||||
|
@ -172,7 +188,7 @@ c_log(Py_complex x)
|
|||
{
|
||||
Py_complex r;
|
||||
double l = hypot(x.real,x.imag);
|
||||
r.imag = atan2(x.imag, x.real);
|
||||
r.imag = ATAN2(x.imag, x.real);
|
||||
r.real = log(l);
|
||||
return r;
|
||||
}
|
||||
|
@ -188,7 +204,7 @@ c_log10(Py_complex x)
|
|||
{
|
||||
Py_complex r;
|
||||
double l = hypot(x.real,x.imag);
|
||||
r.imag = atan2(x.imag, x.real)/log(10.);
|
||||
r.imag = ATAN2(x.imag, x.real)/log(10.);
|
||||
r.real = log10(l);
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -31,6 +31,22 @@ extern double modf (double, double *);
|
|||
#define CHECK(x) /* Don't know how to check */
|
||||
#endif
|
||||
|
||||
#ifdef SCO_ATAN2_BUG
|
||||
/*
|
||||
* UnixWare 7+ is known to have a bug in atan2 that will return PI instead
|
||||
* of ZERO (0) if the first argument is ZERO(0).
|
||||
*/
|
||||
static double atan2_sco(double x, double y)
|
||||
{
|
||||
if (x == 0.0)
|
||||
return (double)0.0;
|
||||
return atan2(x, y);
|
||||
}
|
||||
#define ATAN2 atan2_sco
|
||||
#else
|
||||
#define ATAN2 atan2
|
||||
#endif
|
||||
|
||||
/* Call is_error when errno != 0, and where x is the result libm
|
||||
* returned. is_error will usually set up an exception and return
|
||||
* true (1), but may return false (0) without setting up an exception.
|
||||
|
@ -115,7 +131,7 @@ FUNC1(asin, asin,
|
|||
"asin(x)\n\nReturn the arc sine (measured in radians) of x.")
|
||||
FUNC1(atan, atan,
|
||||
"atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
|
||||
FUNC2(atan2, atan2,
|
||||
FUNC2(atan2, ATAN2,
|
||||
"atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"
|
||||
"Unlike atan(y/x), the signs of both x and y are considered.")
|
||||
FUNC1(ceil, ceil,
|
||||
|
|
|
@ -26,6 +26,22 @@
|
|||
#define PREC_REPR 17
|
||||
#define PREC_STR 12
|
||||
|
||||
#ifdef SCO_ATAN2_BUG
|
||||
/*
|
||||
* UnixWare 7+ is known to have a bug in atan2 that will return PI instead
|
||||
* of ZERO (0) if the first argument is ZERO(0).
|
||||
*/
|
||||
static double atan2_sco(double x, double y)
|
||||
{
|
||||
if (x == 0.0)
|
||||
return (double)0.0;
|
||||
return atan2(x, y);
|
||||
}
|
||||
#define ATAN2 atan2_sco
|
||||
#else
|
||||
#define ATAN2 atan2
|
||||
#endif
|
||||
|
||||
/* elementary operations on complex numbers */
|
||||
|
||||
static Py_complex c_1 = {1., 0.};
|
||||
|
@ -138,7 +154,7 @@ c_pow(Py_complex a, Py_complex b)
|
|||
else {
|
||||
vabs = hypot(a.real,a.imag);
|
||||
len = pow(vabs,b.real);
|
||||
at = atan2(a.imag, a.real);
|
||||
at = ATAN2(a.imag, a.real);
|
||||
phase = at*b.real;
|
||||
if (b.imag != 0.0) {
|
||||
len /= exp(at*b.imag);
|
||||
|
|
|
@ -716,3 +716,10 @@
|
|||
#define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Define the macros needed if on a UnixWare 7.x system. */
|
||||
#if defined(__USLC__) && defined(__SCO_VERSION__)
|
||||
#define SCO_ACCEPT_BUG /* Use workaround for UnixWare accept() bug */
|
||||
#define SCO_ATAN2_BUG /* Use workaround for UnixWare atan2() bug */
|
||||
#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue