summaryrefslogtreecommitdiffstats
path: root/Modules/mathmodule.c
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2002-12-14 19:51:34 (GMT)
committerRaymond Hettinger <python@rcn.com>2002-12-14 19:51:34 (GMT)
commit866964c3a3823c8d42c51a41c5c7264a569200b4 (patch)
tree0ad3fb175d1d8fadb3005ed94ff43a97e82caa0e /Modules/mathmodule.c
parenta828586c3a2a2c07558f8872ef115adc3e24ad9f (diff)
downloadcpython-866964c3a3823c8d42c51a41c5c7264a569200b4.zip
cpython-866964c3a3823c8d42c51a41c5c7264a569200b4.tar.gz
cpython-866964c3a3823c8d42c51a41c5c7264a569200b4.tar.bz2
Apply SF patch 652930: Add optional base argument to math.log(x[, base]).
Diffstat (limited to 'Modules/mathmodule.c')
-rw-r--r--Modules/mathmodule.c62
1 files changed, 47 insertions, 15 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index cbb0000..2572886 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -221,18 +221,8 @@ PyDoc_STRVAR(math_modf_doc,
*/
static PyObject*
-loghelper(PyObject* args, double (*func)(double), char *name)
+loghelper(PyObject* args, double (*func)(double), char *format, PyObject *arg)
{
- PyObject *arg;
- char format[16];
-
- /* See whether this is a long. */
- format[0] = 'O';
- format[1] = ':';
- strcpy(format + 2, name);
- if (! PyArg_ParseTuple(args, format, &arg))
- return NULL;
-
/* If it is long, do it ourselves. */
if (PyLong_Check(arg)) {
double x;
@@ -252,23 +242,65 @@ loghelper(PyObject* args, double (*func)(double), char *name)
}
/* Else let libm handle it by itself. */
- format[0] = 'd';
return math_1(args, func, format);
}
static PyObject *
math_log(PyObject *self, PyObject *args)
{
- return loghelper(args, log, "log");
+ PyObject *arg;
+ PyObject *base = NULL;
+ PyObject *num, *den;
+ PyObject *ans;
+ PyObject *newargs;
+
+ if (! PyArg_ParseTuple(args, "O|O:log", &arg, &base))
+ return NULL;
+ if (base == NULL)
+ return loghelper(args, log, "d:log", arg);
+
+ newargs = PyTuple_New(1);
+ if (newargs == NULL)
+ return NULL;
+ Py_INCREF(arg);
+ PyTuple_SET_ITEM(newargs, 0, arg);
+ num = loghelper(newargs, log, "d:log", arg);
+ Py_DECREF(newargs);
+ if (num == NULL)
+ return NULL;
+
+ newargs = PyTuple_New(1);
+ if (newargs == NULL) {
+ Py_DECREF(num);
+ return NULL;
+ }
+ Py_INCREF(base);
+ PyTuple_SET_ITEM(newargs, 0, base);
+ den = loghelper(newargs, log, "d:log", base);
+ Py_DECREF(newargs);
+ if (den == NULL) {
+ Py_DECREF(num);
+ return NULL;
+ }
+
+ ans = PyNumber_Divide(num, den);
+ Py_DECREF(num);
+ Py_DECREF(den);
+ return ans;
}
PyDoc_STRVAR(math_log_doc,
-"log(x) -> the natural logarithm (base e) of x.");
+"log(x[, base]) -> the logarithm of x to the given base.\n\
+If the base not specified, returns the natural logarithm (base e) of x.");
static PyObject *
math_log10(PyObject *self, PyObject *args)
{
- return loghelper(args, log10, "log10");
+ PyObject *arg;
+
+ if (! PyArg_ParseTuple(args, "O:log10", &arg))
+ return NULL;
+ return loghelper(args, log10, "d:log10", arg);
}
PyDoc_STRVAR(math_log10_doc,