New submission from Christian Heimes:
The patch adds several small enhancements to the math module and pyport.h.
* Py_MATH_PI and Py_MATH_E in long double precision
* Py_IS_NAN and Py_IS_INFINITY use isnan() and isinf() functions were
available (checked by configure)
* isnan and isinf for the math module
* Bessel (1st and 2nd kind), erf, erfc, lgamma function for math module.
They are defined in almost (or all?) math libraries.
Together with http://bugs.python.org/issue1635 it implements most of PEP
754.
----------
components: Extension Modules
files: trunk_mathmodule.patch
keywords: patch
messages: 58694
nosy: tiran
priority: normal
severity: normal
status: open
title: Enhancements for mathmodule
type: rfe
versions: Python 2.6, Python 3.0
Added file: http://bugs.python.org/file8975/trunk_mathmodule.patch
__________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1640>
__________________________________
Index: configure
===================================================================
--- configure (Revision 59539)
+++ configure (Arbeitskopie)
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.in Revision: 59484 .
+# From configure.in Revision: 59533 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for python 2.6.
#
@@ -20368,6 +20368,9 @@
fi
+# ************************************
+# * Check for mathematical functions *
+# ************************************
# check for hypot() in math library
LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM"
@@ -20473,6 +20476,113 @@
done
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in copysign erf erfc isnan isinf j0 j1 jn lgamma_r y0 y1 yn
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
LIBS=$LIBS_SAVE
# check for wchar.h
Index: Include/pyport.h
===================================================================
--- Include/pyport.h (Revision 59539)
+++ Include/pyport.h (Arbeitskopie)
@@ -349,6 +349,17 @@
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
#endif
+/* High precision defintion of pi and e (Euler)
+ * The values are taken from libc6's math.h.
+ */
+#ifndef Py_MATH_PI
+#define Py_MATH_PI 3.1415926535897932384626433832795029L
+#endif
+
+#ifndef Py_MATH_E
+#define Py_MATH_E 2.7182818284590452353602874713526625L
+#endif
+
/* Py_IS_NAN(X)
* Return 1 if float or double arg is a NaN, else 0.
* Caution:
@@ -358,8 +369,12 @@
* a platform where it doesn't work.
*/
#ifndef Py_IS_NAN
+#ifdef HAVE_ISNAN
+#define Py_IS_NAN(X) isnan(X)
+#else
#define Py_IS_NAN(X) ((X) != (X))
#endif
+#endif
/* Py_IS_INFINITY(X)
* Return 1 if float or double arg is an infinity, else 0.
@@ -370,8 +385,12 @@
* Override in pyconfig.h if you have a better spelling on your platform.
*/
#ifndef Py_IS_INFINITY
+#ifdef HAVE_ISINF
+#define Py_IS_INFINITY(X) isinf(X)
+#else
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
#endif
+#endif
/* Py_IS_FINITE(X)
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
Index: configure.in
===================================================================
--- configure.in (Revision 59539)
+++ configure.in (Arbeitskopie)
@@ -2974,10 +2974,16 @@
fi],
[AC_MSG_RESULT(default LIBC="$LIBC")])
+# ************************************
+# * Check for mathematical functions *
+# ************************************
# check for hypot() in math library
LIBS_SAVE=$LIBS
LIBS="$LIBS $LIBM"
AC_REPLACE_FUNCS(hypot)
+
+AC_CHECK_FUNCS(copysign erf erfc isnan isinf j0 j1 jn lgamma_r y0 y1 yn)
+
LIBS=$LIBS_SAVE
# check for wchar.h
Index: PC/pyconfig.h
===================================================================
--- PC/pyconfig.h (Revision 59539)
+++ PC/pyconfig.h (Arbeitskopie)
@@ -416,6 +416,21 @@
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef gid_t */
+/* Define to 1 if you have the `isinf' function. */
+#define HAVE_ISINF 1
+
+/* Define to 1 if you have the `isnan' function. */
+#define HAVE_ISNAN 1
+
+/* Define to 1 if you have the `j0' function. */
+#define HAVE_J0 1
+
+/* Define to 1 if you have the `j1' function. */
+#define HAVE_J1 1
+
+/* Define to 1 if you have the `jn' function. */
+#define HAVE_JN 1
+
/* Define if your struct tm has tm_zone. */
/* #undef HAVE_TM_ZONE */
@@ -521,6 +536,9 @@
/* Define if you have clock. */
/* #define HAVE_CLOCK */
+/* Define to 1 if you have the `copysign' function. */
+#define HAVE_COPYSIGN 1
+
/* Define when any dynamic module loading is enabled */
#define HAVE_DYNAMIC_LOADING
@@ -674,6 +692,15 @@
/* Define if the compiler provides a wchar.h header file. */
#define HAVE_WCHAR_H 1
+/* Define to 1 if you have the `y0' function. */
+#define HAVE_Y0 1
+
+/* Define to 1 if you have the `y1' function. */
+#define HAVE_Y1 1
+
+/* Define to 1 if you have the `yn' function. */
+#define HAVE_YN 1
+
/* Define if you have the dl library (-ldl). */
/* #undef HAVE_LIBDL */
Index: Lib/test/test_math.py
===================================================================
--- Lib/test/test_math.py (Revision 59539)
+++ Lib/test/test_math.py (Arbeitskopie)
@@ -203,6 +203,83 @@
self.ftest('tanh(0)', math.tanh(0), 0)
self.ftest('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0)
+
+ def testBessel_first(self):
+ if not hasattr(math, 'j0'):
+ return
+ for z in 2.4048255576957727, 5.5200781102863106, 8.6537279129110122:
+ self.assertAlmostEqual(math.j0(z), 0)
+ self.assertAlmostEqual(math.jn(0, z), 0)
+ self.assertAlmostEqual(math.j0(0.), 1)
+ self.assert_(math.j0(4.) < 0)
+ for z in 3.8317059702075123, 7.0155866698156122, 10.173468135062722:
+ self.assertAlmostEqual(math.j1(z), 0)
+ self.assertAlmostEqual(math.jn(1, z), 0)
+ self.assert_(math.j1(1.) > 0)
+ self.assert_(math.j0(5.5) < 0)
+ for z in 5.1356223018406826, 8.4172441403998629, 11.619841172149059:
+ self.assertAlmostEqual(math.jn(2, z), 0)
+ self.assert_(math.jn(2 ,1.) > 0)
+ self.assert_(math.jn(2, 7.) < 0)
+
+ def testBessel_second(self):
+ if not hasattr(math, 'y0'):
+ return
+ for z in 0.89357696627916752, 3.9576784193148579, 7.0860510603017727:
+ self.assertAlmostEqual(math.y0(z), 0)
+ self.assertAlmostEqual(math.yn(0, z), 0)
+ for z in 2.1971413260310170, 5.4296810407941351, 8.5960058683311689:
+ self.assertAlmostEqual(math.y1(z), 0)
+ self.assertAlmostEqual(math.yn(1, z), 0)
+ for z in 3.3842417671495935, 6.7938075132682675, 10.023477979360038:
+ self.assertAlmostEqual(math.yn(2, z), 0)
+
+ def testLgamma(self):
+ if not hasattr(math, 'lgamma'):
+ return
+ self.assertEqual(math.lgamma(1.), (0.0, 1))
+ gamma, sign = math.lgamma(1.2)
+ self.assertAlmostEqual(gamma, -0.0853740900)
+ self.assertEqual(sign, 1)
+ self.assertRaises(ValueError, math.lgamma, 0.)
+
+ def testErf(self):
+ if not hasattr(math, 'erf'):
+ return
+ self.assertEqual(math.erf(0.), 0.)
+ self.assertAlmostEqual(math.erf(6.), 1.)
+
+ def testErfc(self):
+ if not hasattr(math, 'erfc'):
+ return
+ self.assertEqual(math.erfc(0.), 1.)
+ self.assertAlmostEqual(math.erfc(10.), 0.)
+
+ def testSign(self):
+ self.assertEqual(math.sign(0), 0)
+ self.assertEqual(math.sign(-2), -1)
+ self.assertEqual(math.sign(+2), 1)
+ self.assertEqual(math.sign(0.), 1)
+ self.assertEqual(math.sign(-0.), -1)
+ self.assertEqual(math.sign(-2.), -1)
+ self.assertEqual(math.sign(+2.), 1)
+
+ def testIsnan(self):
+ self.assert_(math.isnan(float("nan")))
+ self.assert_(math.isnan(float("inf")* 0.))
+ self.failIf(math.isnan(float("inf")))
+ self.failIf(math.isnan(0.))
+ self.failIf(math.isnan(1.))
+
+ def testIsinf(self):
+ self.assert_(math.isinf(float("inf")))
+ self.assert_(math.isinf(float("-inf")))
+ self.assert_(math.isinf(1E400))
+ self.assert_(math.isinf(-1E400))
+ self.failIf(math.isinf(float("nan")))
+ self.failIf(math.isinf(0.))
+ self.failIf(math.isinf(1.))
+
# RED_FLAG 16-Oct-2000 Tim
# While 2.0 is more consistent about exceptions than previous releases, it
# still fails this part of the test on some platforms. For now, we only
@@ -247,3 +324,4 @@
if __name__ == '__main__':
test_main()
+
Index: Modules/mathmodule.c
===================================================================
--- Modules/mathmodule.c (Revision 59539)
+++ Modules/mathmodule.c (Arbeitskopie)
@@ -86,6 +86,29 @@
return PyFloat_FromDouble(x);
}
+static PyObject *
+math_2n(PyObject *args, double (*func) (int, double), char *funcname)
+{
+ PyObject *oi, *ox;
+ long i;
+ double x;
+ if (! PyArg_UnpackTuple(args, funcname, 2, 2, &oi, &ox))
+ return NULL;
+ i = PyInt_AsLong(oi);
+ x = PyFloat_AsDouble(ox);
+ if ((i == -1 || x == -1.0) && PyErr_Occurred())
+ return NULL;
+ errno = 0;
+ PyFPE_START_PROTECT("in math_2", return 0)
+ x = (*func)(i, x);
+ PyFPE_END_PROTECT(x)
+ Py_SET_ERRNO_ON_MATH_ERROR(x);
+ if (errno && is_error(x))
+ return NULL;
+ else
+ return PyFloat_FromDouble(x);
+}
+
#define FUNC1(funcname, func, docstring) \
static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
return math_1(args, func); \
@@ -97,6 +120,11 @@
return math_2(args, func, #funcname); \
}\
PyDoc_STRVAR(math_##funcname##_doc, docstring);
+#define FUNC2n(funcname, func, docstring) \
+ static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
+ return math_2n(args, func, #funcname); \
+ }\
+ PyDoc_STRVAR(math_##funcname##_doc, docstring);
FUNC1(acos, acos,
"acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
@@ -114,6 +142,15 @@
"cos(x)\n\nReturn the cosine of x (measured in radians).")
FUNC1(cosh, cosh,
"cosh(x)\n\nReturn the hyperbolic cosine of x.")
+#ifdef HAVE_ERF
+FUNC1(erf, erf,
+ "erf(x)\n\nReturn the error function of x.")
+#endif
+#ifdef HAVE_ERFC
+FUNC1(erfc, erfc,
+ "erfc(x)\n\nReturn the error function of 1-erf(x) in a way that \n\
+avoids rounding errors for large x.")
+#endif
FUNC1(exp, exp,
"exp(x)\n\nReturn e raised to the power of x.")
FUNC1(fabs, fabs,
@@ -126,6 +163,18 @@
" x % y may differ.")
FUNC2(hypot, hypot,
"hypot(x,y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).")
+#ifdef HAVE_J0
+FUNC1(j0, j0,
+ "j0(x)\n\nReturn Bessel functions of x of the 1st kind of order 0.")
+#endif
+#ifdef HAVE_J1
+FUNC1(j1, j1,
+ "j1(x)\n\nReturn Bessel functions of x of the 1st kind of order 1.")
+#endif
+#ifdef HAVE_JN
+FUNC2n(jn, jn,
+ "jn(n, x)\n\nReturn Bessel functions of x of the 1st kind of order n.")
+#endif
FUNC2(pow, pow,
"pow(x,y)\n\nReturn x**y (x to the power of y).")
FUNC1(sin, sin,
@@ -138,6 +187,18 @@
"tan(x)\n\nReturn the tangent of x (measured in radians).")
FUNC1(tanh, tanh,
"tanh(x)\n\nReturn the hyperbolic tangent of x.")
+#ifdef HAVE_Y0
+FUNC1(y0, y0,
+ "j0(x)\n\nReturn Bessel functions of x of the 2nd kind of order 0.")
+#endif
+#ifdef HAVE_Y1
+FUNC1(y1, y1,
+ "j1(x)\n\nReturn Bessel functions of x of the 2nd kind of order 1.")
+#endif
+#ifdef HAVE_YN
+FUNC2n(yn, yn,
+ "jn(n, x)\n\nReturn Bessel functions of x of the 2nd kind of order n.")
+#endif
static PyObject *
math_frexp(PyObject *self, PyObject *arg)
@@ -277,9 +338,8 @@
PyDoc_STRVAR(math_log10_doc,
"log10(x) -> the base 10 logarithm of x.");
-/* XXX(nnorwitz): Should we use the platform M_PI or something more accurate
- like: 3.14159265358979323846264338327950288 */
-static const double degToRad = 3.141592653589793238462643383 / 180.0;
+static const double degToRad = Py_MATH_PI / 180.0;
+static const double radToDeg = 180.0 / Py_MATH_PI;
static PyObject *
math_degrees(PyObject *self, PyObject *arg)
@@ -287,7 +347,7 @@
double x = PyFloat_AsDouble(arg);
if (x == -1.0 && PyErr_Occurred())
return NULL;
- return PyFloat_FromDouble(x / degToRad);
+ return PyFloat_FromDouble(x * radToDeg);
}
PyDoc_STRVAR(math_degrees_doc,
@@ -305,6 +365,110 @@
PyDoc_STRVAR(math_radians_doc,
"radians(x) -> converts angle x from degrees to radians");
+static PyObject *
+math_isnan(PyObject *self, PyObject *arg)
+{
+ double x = PyFloat_AsDouble(arg);
+ if (x == -1.0 && PyErr_Occurred())
+ return NULL;
+ return PyBool_FromLong((long)Py_IS_NAN(x));
+}
+
+PyDoc_STRVAR(math_isnan_doc,
+"isnan(x) -> bool\n\
+Checks if float x is not a number (NaN)");
+
+static PyObject *
+math_isinf(PyObject *self, PyObject *arg)
+{
+ double x = PyFloat_AsDouble(arg);
+ if (x == -1.0 && PyErr_Occurred())
+ return NULL;
+ return PyBool_FromLong((long)Py_IS_INFINITY(x));
+}
+
+PyDoc_STRVAR(math_isinf_doc,
+"isinf(x) -> bool\n\
+Checks if float x is infinite (positive or negative)");
+
+static PyObject *
+math_sign(PyObject *self, PyObject *arg)
+{
+ int result = -2;
+ if (PyInt_Check(arg)) {
+ long l = PyInt_AsLong(arg);
+ if (l == -1.0 && PyErr_Occurred())
+ return NULL;
+ result = l > 0 ? 1 :
+ l < 0 ? -1 : 0;
+
+ }
+ if (PyLong_Check(arg)) {
+ result = _PyLong_Sign(arg);
+ }
+ else if (PyFloat_Check(arg)) {
+ double x = PyFloat_AsDouble(arg);
+ if (x == -1.0 && PyErr_Occurred())
+ return NULL;
+#ifdef HAVE_COPYSIGN
+ result = (int)copysign(1., x);
+#else
+ result = x > 0. ? 1 :
+ x < 0. ? -1 : 0;
+#endif
+ }
+ if (result == -2) {
+ PyErr_Format(PyExc_TypeError,
+ "sign() expected int, long or float, found %s",
+ Py_Type(arg)->tp_name);
+ return NULL;
+ }
+ return PyInt_FromLong((long)result);
+}
+
+PyDoc_STRVAR(math_sign_doc,
+"sign(x) -> +1 / 0 / -1\n\
+Return the sign of an int, long or float. On platforms with full IEE 754\n\
+semantic sign(0.) returns +1 and sign(-0.) returns -1. On other platforms\n\
+sign(0.) always returns 0.");
+
+#ifdef HAVE_LGAMMA_R
+static PyObject *
+math_lgamma(PyObject *self, PyObject *arg)
+{
+ PyObject *result, *o;
+ double x;
+ int sign;
+
+ x = PyFloat_AsDouble(arg);
+ if (x == -1.0 && PyErr_Occurred())
+ return NULL;
+ errno = 0;
+ PyFPE_START_PROTECT("in lgamma", return NULL)
+ x = lgamma_r(x, &sign);
+ PyFPE_END_PROTECT(x)
+ Py_SET_ERRNO_ON_MATH_ERROR(x);
+ if (errno && is_error(x))
+ return NULL;
+
+ result = PyTuple_New(2);
+ if (result == NULL)
+ return NULL;
+ o = PyFloat_FromDouble(x);
+ if (PyTuple_SetItem(result, 0, o) != 0)
+ return NULL;
+ o = PyInt_FromLong(sign);
+ if (PyTuple_SetItem(result, 1, o) != 0)
+ return NULL;
+ return result;
+
+}
+PyDoc_STRVAR(math_lgamma_doc,
+"lgamma(x) -> (result, sign)\n\
+Return the natural logarithm of the gamma function and the sign of the \n\
+gamma function so that gamma = exp(result) * sign.");
+#endif /* HAVE_LGAMMA_R */
+
static PyMethodDef math_methods[] = {
{"acos", math_acos, METH_O, math_acos_doc},
{"asin", math_asin, METH_O, math_asin_doc},
@@ -314,23 +478,53 @@
{"cos", math_cos, METH_O, math_cos_doc},
{"cosh", math_cosh, METH_O, math_cosh_doc},
{"degrees", math_degrees, METH_O, math_degrees_doc},
+#ifdef HAVE_ERF
+ {"erf", math_erf, METH_O, math_erf_doc},
+#endif
+#ifdef HAVE_ERFC
+ {"erfc", math_erfc, METH_O, math_erfc_doc},
+#endif
{"exp", math_exp, METH_O, math_exp_doc},
{"fabs", math_fabs, METH_O, math_fabs_doc},
{"floor", math_floor, METH_O, math_floor_doc},
{"fmod", math_fmod, METH_VARARGS, math_fmod_doc},
{"frexp", math_frexp, METH_O, math_frexp_doc},
{"hypot", math_hypot, METH_VARARGS, math_hypot_doc},
+ {"isinf", math_isinf, METH_O, math_isinf_doc},
+ {"isnan", math_isnan, METH_O, math_isnan_doc},
{"ldexp", math_ldexp, METH_VARARGS, math_ldexp_doc},
+#ifdef HAVE_LGAMMA_R
+ {"lgamma", math_lgamma, METH_O, math_lgamma_doc},
+#endif
{"log", math_log, METH_VARARGS, math_log_doc},
{"log10", math_log10, METH_O, math_log10_doc},
{"modf", math_modf, METH_O, math_modf_doc},
{"pow", math_pow, METH_VARARGS, math_pow_doc},
{"radians", math_radians, METH_O, math_radians_doc},
+ {"sign", math_sign, METH_O, math_sign_doc},
{"sin", math_sin, METH_O, math_sin_doc},
{"sinh", math_sinh, METH_O, math_sinh_doc},
{"sqrt", math_sqrt, METH_O, math_sqrt_doc},
{"tan", math_tan, METH_O, math_tan_doc},
{"tanh", math_tanh, METH_O, math_tanh_doc},
+#ifdef HAVE_J0
+ {"j0", math_j0, METH_O, math_j0_doc},
+#endif
+#ifdef HAVE_J1
+ {"j1", math_j1, METH_O, math_j1_doc},
+#endif
+#ifdef HAVE_JN
+ {"jn", math_jn, METH_VARARGS, math_jn_doc},
+#endif
+#ifdef HAVE_Y0
+ {"y0", math_y0, METH_O, math_y0_doc},
+#endif
+#ifdef HAVE_Y1
+ {"y1", math_y1, METH_O, math_y1_doc},
+#endif
+#ifdef HAVE_YN
+ {"yn", math_yn, METH_VARARGS, math_yn_doc},
+#endif
{NULL, NULL} /* sentinel */
};
@@ -351,13 +545,13 @@
if (d == NULL)
goto finally;
- if (!(v = PyFloat_FromDouble(atan(1.0) * 4.0)))
+ if (!(v = PyFloat_FromDouble(Py_MATH_PI)))
goto finally;
if (PyDict_SetItemString(d, "pi", v) < 0)
goto finally;
Py_DECREF(v);
- if (!(v = PyFloat_FromDouble(exp(1.0))))
+ if (!(v = PyFloat_FromDouble(Py_MATH_E)))
goto finally;
if (PyDict_SetItemString(d, "e", v) < 0)
goto finally;
Index: pyconfig.h.in
===================================================================
--- pyconfig.h.in (Revision 59539)
+++ pyconfig.h.in (Arbeitskopie)
@@ -85,6 +85,9 @@
/* Define to 1 if you have the <conio.h> header file. */
#undef HAVE_CONIO_H
+/* Define to 1 if you have the `copysign' function. */
+#undef HAVE_COPYSIGN
+
/* Define to 1 if you have the `ctermid' function. */
#undef HAVE_CTERMID
@@ -135,6 +138,12 @@
/* Defined when any dynamic module loading is enabled. */
#undef HAVE_DYNAMIC_LOADING
+/* Define to 1 if you have the `erf' function. */
+#undef HAVE_ERF
+
+/* Define to 1 if you have the `erfc' function. */
+#undef HAVE_ERFC
+
/* Define to 1 if you have the <errno.h> header file. */
#undef HAVE_ERRNO_H
@@ -288,6 +297,21 @@
/* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H
+/* Define to 1 if you have the `isinf' function. */
+#undef HAVE_ISINF
+
+/* Define to 1 if you have the `isnan' function. */
+#undef HAVE_ISNAN
+
+/* Define to 1 if you have the `j0' function. */
+#undef HAVE_J0
+
+/* Define to 1 if you have the `j1' function. */
+#undef HAVE_J1
+
+/* Define to 1 if you have the `jn' function. */
+#undef HAVE_JN
+
/* Define to 1 if you have the `kill' function. */
#undef HAVE_KILL
@@ -312,6 +336,9 @@
/* Define to 1 if you have the `lchown' function. */
#undef HAVE_LCHOWN
+/* Define to 1 if you have the `lgamma_r' function. */
+#undef HAVE_LGAMMA_R
+
/* Define to 1 if you have the `dl' library (-ldl). */
#undef HAVE_LIBDL
@@ -747,6 +774,15 @@
*/
#undef HAVE_WORKING_TZSET
+/* Define to 1 if you have the `y0' function. */
+#undef HAVE_Y0
+
+/* Define to 1 if you have the `y1' function. */
+#undef HAVE_Y1
+
+/* Define to 1 if you have the `yn' function. */
+#undef HAVE_YN
+
/* Define if the zlib library has inflateCopy */
#undef HAVE_ZLIB_COPY
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com