\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 are provided by this module.  Except
when explicitly noted otherwise, all return values are floats.

Number-theoretic and representation functions:

\begin{funcdesc}{ceil}{x}
Return the ceiling of \var{x} as a float, the smallest integer value
greater than or equal to \var{x}.
\end{funcdesc}

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

\begin{funcdesc}{floor}{x}
Return the floor of \var{x} as a float, the largest integer value
less than or equal to \var{x}.
\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.  The intent of the C standard is that
\code{fmod(\var{x}, \var{y})} be exactly (mathematically; to infinite
precision) equal to \code{\var{x} - \var{n}*\var{y}} for some integer
\var{n} such that the result has the same sign as \var{x} and
magnitude less than \code{abs(\var{y})}.  Python's
\code{\var{x} \%\ \var{y}} returns a result with the sign of
\var{y} instead, and may not be exactly computable for float arguments.
For example, \code{fmod(-1e-100, 1e100)} is \code{-1e-100}, but the
result of Python's \code{-1e-100 \%\ 1e100} is \code{1e100-1e-100}, which
cannot be represented exactly as a float, and rounds to the surprising
\code{1e100}.  For this reason, function \function{fmod()} is generally
preferred when working with floats, while Python's
\code{\var{x} \%\ \var{y}} is preferred when working with integers.
\end{funcdesc}

\begin{funcdesc}{frexp}{x}
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}} exactly.
If \var{x} is zero, returns \code{(0.0, 0)}, otherwise
\code{0.5 <= abs(\var{m}) < 1}.  This is used to "pick apart" the
internal representation of a float in a portable way.
\end{funcdesc}

\begin{funcdesc}{ldexp}{x, i}
Return \code{\var{x} * (2**\var{i})}.  This is essentially the inverse of
function \function{frexp()}.
\end{funcdesc}

\begin{funcdesc}{modf}{x}
Return the fractional and integer parts of \var{x}.  Both results
carry the sign of \var{x}, and both are floats.
\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).

For the \function{ceil()}, \function{floor()}, and \function{modf()}
functions, note that \emph{all} floating-point numbers of sufficiently
large magnitude are exact integers.  Python floats typically carry no more
than 53 bits of precision (the same as the platform C double type), in
which case any float \var{x} with \code{abs(\var{x}) >= 2**52}
necessarily has no fractional bits.


Power and logarithmic functions:

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

\begin{funcdesc}{log}{x\optional{, base}}
Return the logarithm of \var{x} to the given \var{base}.
If the \var{base} is not specified, return the natural logarithm of \var{x}
(that is, the logarithm to base \emph{e}).
\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}{pow}{x, y}
Return \code{\var{x}**\var{y}}.
\end{funcdesc}

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

Trigonometric functions:

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

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

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

\begin{funcdesc}{atan2}{y, x}
Return \code{atan(\var{y} / \var{x})}, in radians.
The result is between \code{-pi} and \code{pi}.
The vector in the plane from the origin to point \code{(\var{x}, \var{y})}
makes this angle with the positive X axis.
The point of \function{atan2()} is that the signs of both inputs are
known to it, so it can compute the correct quadrant for the angle.
For example, \code{atan(1}) and \code{atan2(1, 1)} are both \code{pi/4},
but \code{atan2(-1, -1)} is \code{-3*pi/4}.
\end{funcdesc}

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

\begin{funcdesc}{hypot}{x, y}
Return the Euclidean norm, \code{sqrt(\var{x}*\var{x} + \var{y}*\var{y})}.
This is the length of the vector from the origin to point
\code{(\var{x}, \var{y})}.
\end{funcdesc}

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

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

Angular conversion:

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

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

Hyperbolic functions:

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

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

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

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{notice}
  The \module{math} module consists mostly of thin wrappers around
  the platform C math library functions.  Behavior in exceptional cases is
  loosely specified by the C standards, and Python inherits much of its
  math-function error-reporting behavior from the platform C
  implementation.  As a result,
  the specific exceptions raised in error cases (and even whether some
  arguments are considered to be exceptional at all) are not defined in any
  useful cross-platform or cross-release way.  For example, whether
  \code{math.log(0)} returns \code{-Inf} or raises \exception{ValueError} or
  \exception{OverflowError} isn't defined, and in
  cases where \code{math.log(0)} raises \exception{OverflowError},
  \code{math.log(0L)} may raise \exception{ValueError} instead.
\end{notice}

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