\section{\module{math} ---
         Mathematical functions}

\declaremodule{builtin}{math}
\modulesynopsis{Mathematical functions (\function{sin()} etc.).}

This module is always available.  It provides access to the
mathematical functions defined by the C standard.

These functions cannot be used with complex numbers; use the functions
of the same name from the \refmodule{cmath} module if you require
support for complex numbers.  The distinction between functions which
support complex numbers and those which don't is made since most users
do not want to learn quite as much mathematics as required to
understand complex numbers.  Receiving an exception instead of a
complex result allows earlier detection of the unexpected complex
number used as a parameter, so that the programmer can determine how
and why it was generated in the first place.

The following functions provided by this module:

\begin{funcdesc}{acos}{x}
Return the arc cosine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{asin}{x}
Return the arc sine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{atan}{x}
Return the arc tangent of \var{x}.
\end{funcdesc}

\begin{funcdesc}{atan2}{y, x}
Return \code{atan(\var{y} / \var{x})}.
\end{funcdesc}

\begin{funcdesc}{ceil}{x}
Return the ceiling of \var{x} as a float.
\end{funcdesc}

\begin{funcdesc}{cos}{x}
Return the cosine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{cosh}{x}
Return the hyperbolic cosine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{degrees}{x}
Converts angle \var{x} from radians to degrees.
\end{funcdesc}

\begin{funcdesc}{exp}{x}
Return \code{e**\var{x}}.
\end{funcdesc}

\begin{funcdesc}{fabs}{x}
Return the absolute value of the floating point number \var{x}.
\end{funcdesc}

\begin{funcdesc}{floor}{x}
Return the floor of \var{x} as a float.
\end{funcdesc}

\begin{funcdesc}{fmod}{x, y}
Return \code{fmod(\var{x}, \var{y})}, as defined by the platform C library.
Note that the Python expression \code{\var{x} \%\ \var{y}} may not return
the same result.
\end{funcdesc}

\begin{funcdesc}{frexp}{x}
% Blessed by Tim.
Return the mantissa and exponent of \var{x} as the pair
\code{(\var{m}, \var{e})}.  \var{m} is a float and \var{e} is an
integer such that \code{\var{x} == \var{m} * 2**\var{e}}.
If \var{x} is zero, returns \code{(0.0, 0)}, otherwise
\code{0.5 <= abs(\var{m}) < 1}.
\end{funcdesc}

\begin{funcdesc}{hypot}{x, y}
Return the Euclidean distance, \code{sqrt(\var{x}*\var{x} + \var{y}*\var{y})}.
\end{funcdesc}

\begin{funcdesc}{ldexp}{x, i}
Return \code{\var{x} * (2**\var{i})}.
\end{funcdesc}

\begin{funcdesc}{log}{x\optional{, base}}
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}.
\versionchanged[\var{base} argument added]{2.3}
\end{funcdesc}

\begin{funcdesc}{log10}{x}
Return the base-10 logarithm of \var{x}.
\end{funcdesc}

\begin{funcdesc}{modf}{x}
Return the fractional and integer parts of \var{x}.  Both results
carry the sign of \var{x}.  The integer part is returned as a float.
\end{funcdesc}

\begin{funcdesc}{pow}{x, y}
Return \code{\var{x}**\var{y}}.
\end{funcdesc}

\begin{funcdesc}{radians}{x}
Converts angle \var{x} from degrees to radians.
\end{funcdesc}

\begin{funcdesc}{sin}{x}
Return the sine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{sinh}{x}
Return the hyperbolic sine of \var{x}.
\end{funcdesc}

\begin{funcdesc}{sqrt}{x}
Return the square root of \var{x}.
\end{funcdesc}

\begin{funcdesc}{tan}{x}
Return the tangent of \var{x}.
\end{funcdesc}

\begin{funcdesc}{tanh}{x}
Return the hyperbolic tangent of \var{x}.
\end{funcdesc}

Note that \function{frexp()} and \function{modf()} have a different
call/return pattern than their C equivalents: they take a single
argument and return a pair of values, rather than returning their
second return value through an `output parameter' (there is no such
thing in Python).

The module also defines two mathematical constants:

\begin{datadesc}{pi}
The mathematical constant \emph{pi}.
\end{datadesc}

\begin{datadesc}{e}
The mathematical constant \emph{e}.
\end{datadesc}

\begin{seealso}
  \seemodule{cmath}{Complex number versions of many of these functions.}
\end{seealso}
