Kaydet (Commit) b67ad7e6 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Patch #826074: cmath.log optional base argument, fixes #823209

(Contributed by Andrew Gaul.)
üst ad21945d
...@@ -73,10 +73,12 @@ Return the hyperbolic cosine of \var{x}. ...@@ -73,10 +73,12 @@ Return the hyperbolic cosine of \var{x}.
Return the exponential value \code{e**\var{x}}. Return the exponential value \code{e**\var{x}}.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{log}{x} \begin{funcdesc}{log}{x\optional{, base}}
Return the natural logarithm of \var{x}. Returns the logarithm of \var{x} to the given \var{base}.
If the \var{base} is not specified, returns the natural logarithm of \var{x}.
There is one branch cut, from 0 along the negative real axis to There is one branch cut, from 0 along the negative real axis to
-\infinity, continuous from above. -\infinity, continuous from above.
\versionchanged[\var{base} argument added]{2.4}
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{log10}{x} \begin{funcdesc}{log10}{x}
......
...@@ -2,8 +2,25 @@ ...@@ -2,8 +2,25 @@
""" Simple test script for cmathmodule.c """ Simple test script for cmathmodule.c
Roger E. Masse Roger E. Masse
""" """
import cmath import cmath, math
from test.test_support import verbose from test.test_support import verbose, verify, TestFailed
verify(abs(cmath.log(10) - math.log(10)) < 1e-9)
verify(abs(cmath.log(10,2) - math.log(10,2)) < 1e-9)
try:
cmath.log('a')
except TypeError:
pass
else:
raise TestFailed
try:
cmath.log(10, 'a')
except TypeError:
pass
else:
raise TestFailed
testdict = {'acos' : 1.0, testdict = {'acos' : 1.0,
'acosh' : 1.0, 'acosh' : 1.0,
......
...@@ -336,6 +336,9 @@ Extension modules ...@@ -336,6 +336,9 @@ Extension modules
Library Library
------- -------
- Bug #823209: cmath.log() now takes an optional base argument so that its
API matches math.log().
- Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions - Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions
that generate a *-debuginfo.rpm. that generate a *-debuginfo.rpm.
......
...@@ -20,6 +20,7 @@ static Py_complex c_halfi = {0., 0.5}; ...@@ -20,6 +20,7 @@ static Py_complex c_halfi = {0., 0.5};
static Py_complex c_log(Py_complex); static Py_complex c_log(Py_complex);
static Py_complex c_prodi(Py_complex); static Py_complex c_prodi(Py_complex);
static Py_complex c_sqrt(Py_complex); static Py_complex c_sqrt(Py_complex);
static PyObject * math_error(void);
static Py_complex static Py_complex
...@@ -164,11 +165,6 @@ c_log(Py_complex x) ...@@ -164,11 +165,6 @@ c_log(Py_complex x)
return r; return r;
} }
PyDoc_STRVAR(c_log_doc,
"log(x)\n"
"\n"
"Return the natural logarithm of x.");
static Py_complex static Py_complex
c_log10(Py_complex x) c_log10(Py_complex x)
...@@ -312,6 +308,31 @@ PyDoc_STRVAR(c_tanh_doc, ...@@ -312,6 +308,31 @@ PyDoc_STRVAR(c_tanh_doc,
"\n" "\n"
"Return the hyperbolic tangent of x."); "Return the hyperbolic tangent of x.");
static PyObject *
cmath_log(PyObject *self, PyObject *args)
{
Py_complex x;
Py_complex y;
if (!PyArg_ParseTuple(args, "D|D", &x, &y))
return NULL;
errno = 0;
PyFPE_START_PROTECT("complex function", return 0)
x = c_log(x);
if (PyTuple_GET_SIZE(args) == 2)
x = c_quot(x, c_log(y));
PyFPE_END_PROTECT(x)
if (errno != 0)
return math_error();
Py_ADJUST_ERANGE2(x.real, x.imag);
return PyComplex_FromCComplex(x);
}
PyDoc_STRVAR(cmath_log_doc,
"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.");
/* And now the glue to make them available from Python: */ /* And now the glue to make them available from Python: */
...@@ -358,7 +379,6 @@ FUNC1(cmath_atanh, c_atanh) ...@@ -358,7 +379,6 @@ FUNC1(cmath_atanh, c_atanh)
FUNC1(cmath_cos, c_cos) FUNC1(cmath_cos, c_cos)
FUNC1(cmath_cosh, c_cosh) FUNC1(cmath_cosh, c_cosh)
FUNC1(cmath_exp, c_exp) FUNC1(cmath_exp, c_exp)
FUNC1(cmath_log, c_log)
FUNC1(cmath_log10, c_log10) FUNC1(cmath_log10, c_log10)
FUNC1(cmath_sin, c_sin) FUNC1(cmath_sin, c_sin)
FUNC1(cmath_sinh, c_sinh) FUNC1(cmath_sinh, c_sinh)
...@@ -381,7 +401,7 @@ static PyMethodDef cmath_methods[] = { ...@@ -381,7 +401,7 @@ static PyMethodDef cmath_methods[] = {
{"cos", cmath_cos, METH_VARARGS, c_cos_doc}, {"cos", cmath_cos, METH_VARARGS, c_cos_doc},
{"cosh", cmath_cosh, METH_VARARGS, c_cosh_doc}, {"cosh", cmath_cosh, METH_VARARGS, c_cosh_doc},
{"exp", cmath_exp, METH_VARARGS, c_exp_doc}, {"exp", cmath_exp, METH_VARARGS, c_exp_doc},
{"log", cmath_log, METH_VARARGS, c_log_doc}, {"log", cmath_log, METH_VARARGS, cmath_log_doc},
{"log10", cmath_log10, METH_VARARGS, c_log10_doc}, {"log10", cmath_log10, METH_VARARGS, c_log10_doc},
{"sin", cmath_sin, METH_VARARGS, c_sin_doc}, {"sin", cmath_sin, METH_VARARGS, c_sin_doc},
{"sinh", cmath_sinh, METH_VARARGS, c_sinh_doc}, {"sinh", cmath_sinh, METH_VARARGS, c_sinh_doc},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment