:mod:`!cmath` --- Mathematical functions for complex numbers
============================================================

.. module:: cmath
   :synopsis: Mathematical functions for complex numbers.

--------------

This module provides access to mathematical functions for complex numbers.  The
functions in this module accept integers, floating-point numbers or complex
numbers as arguments. They will also accept any Python object that has either a
:meth:`~object.__complex__` or a :meth:`~object.__float__` method: these methods are used to
convert the object to a complex or floating-point number, respectively, and
the function is then applied to the result of the conversion.

.. note::

   For functions involving branch cuts, we have the problem of deciding how to
   define those functions on the cut itself. Following Kahan's "Branch cuts for
   complex elementary functions" paper, as well as Annex G of C99 and later C
   standards, we use the sign of zero to distinguish one side of the branch cut
   from the other: for a branch cut along (a portion of) the real axis we look
   at the sign of the imaginary part, while for a branch cut along the
   imaginary axis we look at the sign of the real part.

   For example, the :func:`cmath.sqrt` function has a branch cut along the
   negative real axis. An argument of ``-2-0j`` is treated as
   though it lies *below* the branch cut, and so gives a result on the negative
   imaginary axis::

      >>> cmath.sqrt(-2-0j)
      -1.4142135623730951j

   But an argument of ``-2+0j`` is treated as though it lies above
   the branch cut::

      >>> cmath.sqrt(-2+0j)
      1.4142135623730951j


====================================================  ============================================
**Conversions to and from polar coordinates**
--------------------------------------------------------------------------------------------------
:func:`phase(z) <phase>`                              Return the phase of *z*
:func:`polar(z) <polar>`                              Return the representation of *z* in polar coordinates
:func:`rect(r, phi) <rect>`                           Return the complex number *z* with polar coordinates *r* and *phi*

**Power and logarithmic functions**
--------------------------------------------------------------------------------------------------
:func:`exp(z) <exp>`                                  Return *e* raised to the power *z*
:func:`log(z[, base]) <log>`                          Return the logarithm of *z* to the given *base* (*e* by default)
:func:`log10(z) <log10>`                              Return the base-10 logarithm of *z*
:func:`sqrt(z) <sqrt>`                                Return the square root of *z*

**Trigonometric functions**
--------------------------------------------------------------------------------------------------
:func:`acos(z) <acos>`                                Return the arc cosine of *z*
:func:`asin(z) <asin>`                                Return the arc sine of *z*
:func:`atan(z) <atan>`                                Return the arc tangent of *z*
:func:`cos(z) <cos>`                                  Return the cosine of *z*
:func:`sin(z) <sin>`                                  Return the sine of *z*
:func:`tan(z) <tan>`                                  Return the tangent of *z*

**Hyperbolic functions**
--------------------------------------------------------------------------------------------------
:func:`acosh(z) <acosh>`                              Return the inverse hyperbolic cosine of *z*
:func:`asinh(z) <asinh>`                              Return the inverse hyperbolic sine of *z*
:func:`atanh(z) <atanh>`                              Return the inverse hyperbolic tangent of *z*
:func:`cosh(z) <cosh>`                                Return the hyperbolic cosine of *z*
:func:`sinh(z) <sinh>`                                Return the hyperbolic sine of *z*
:func:`tanh(z) <tanh>`                                Return the hyperbolic tangent of *z*

**Classification functions**
--------------------------------------------------------------------------------------------------
:func:`isfinite(z) <isfinite>`                        Check if all components of *z* are finite
:func:`isinf(z) <isinf>`                              Check if any component of *z* is infinite
:func:`isnan(z) <isnan>`                              Check if any component of *z* is a NaN
:func:`isclose(a, b, *, rel_tol, abs_tol) <isclose>`  Check if the values *a* and *b* are close to each other

**Constants**
--------------------------------------------------------------------------------------------------
:data:`pi`                                            *π* = 3.141592...
:data:`e`                                             *e* = 2.718281...
:data:`tau`                                           *τ* = 2\ *π* = 6.283185...
:data:`inf`                                           Positive infinity
:data:`infj`                                          Pure imaginary infinity
:data:`nan`                                           "Not a number" (NaN)
:data:`nanj`                                          Pure imaginary NaN
====================================================  ============================================


Conversions to and from polar coordinates
-----------------------------------------

A Python complex number ``z`` is stored internally using *rectangular*
or *Cartesian* coordinates.  It is completely determined by its *real
part* ``z.real`` and its *imaginary part* ``z.imag``.

*Polar coordinates* give an alternative way to represent a complex
number.  In polar coordinates, a complex number *z* is defined by the
modulus *r* and the phase angle *phi*. The modulus *r* is the distance
from *z* to the origin, while the phase *phi* is the counterclockwise
angle, measured in radians, from the positive x-axis to the line
segment that joins the origin to *z*.

The following functions can be used to convert from the native
rectangular coordinates to polar coordinates and back.

.. function:: phase(z)

   Return the phase of *z* (also known as the *argument* of *z*), as a float.
   ``phase(z)`` is equivalent to ``math.atan2(z.imag, z.real)``.  The result
   lies in the range [-\ *π*, *π*], and the branch cut for this operation lies
   along the negative real axis.  The sign of the result is the same as the
   sign of ``z.imag``, even when ``z.imag`` is zero::

      >>> phase(-1+0j)
      3.141592653589793
      >>> phase(-1-0j)
      -3.141592653589793


.. note::

   The modulus (absolute value) of a complex number *z* can be
   computed using the built-in :func:`abs` function.  There is no
   separate :mod:`cmath` module function for this operation.


.. function:: polar(z)

   Return the representation of *z* in polar coordinates.  Returns a
   pair ``(r, phi)`` where *r* is the modulus of *z* and *phi* is the
   phase of *z*.  ``polar(z)`` is equivalent to ``(abs(z),
   phase(z))``.


.. function:: rect(r, phi)

   Return the complex number *z* with polar coordinates *r* and *phi*.
   Equivalent to ``complex(r * math.cos(phi), r * math.sin(phi))``.


Power and logarithmic functions
-------------------------------

.. function:: exp(z)

   Return *e* raised to the power *z*, where *e* is the base of natural
   logarithms.


.. function:: log(z[, base])

   Return the logarithm of *z* to the given *base*. If the *base* is not
   specified, returns the natural logarithm of *z*. There is one branch cut,
   from 0 along the negative real axis to -∞.


.. function:: log10(z)

   Return the base-10 logarithm of *z*. This has the same branch cut as
   :func:`log`.


.. function:: sqrt(z)

   Return the square root of *z*. This has the same branch cut as :func:`log`.


Trigonometric functions
-----------------------

.. function:: acos(z)

   Return the arc cosine of *z*. There are two branch cuts: One extends right
   from 1 along the real axis to ∞. The other extends left from -1 along the
   real axis to -∞.


.. function:: asin(z)

   Return the arc sine of *z*. This has the same branch cuts as :func:`acos`.


.. function:: atan(z)

   Return the arc tangent of *z*. There are two branch cuts: One extends from
   ``1j`` along the imaginary axis to ``∞j``. The other extends from ``-1j``
   along the imaginary axis to ``-∞j``.


.. function:: cos(z)

   Return the cosine of *z*.


.. function:: sin(z)

   Return the sine of *z*.


.. function:: tan(z)

   Return the tangent of *z*.


Hyperbolic functions
--------------------

.. function:: acosh(z)

   Return the inverse hyperbolic cosine of *z*. There is one branch cut,
   extending left from 1 along the real axis to -∞.


.. function:: asinh(z)

   Return the inverse hyperbolic sine of *z*. There are two branch cuts:
   One extends from ``1j`` along the imaginary axis to ``∞j``.  The other
   extends from ``-1j`` along the imaginary axis to ``-∞j``.


.. function:: atanh(z)

   Return the inverse hyperbolic tangent of *z*. There are two branch cuts: One
   extends from ``1`` along the real axis to ``∞``. The other extends from
   ``-1`` along the real axis to ``-∞``.


.. function:: cosh(z)

   Return the hyperbolic cosine of *z*.


.. function:: sinh(z)

   Return the hyperbolic sine of *z*.


.. function:: tanh(z)

   Return the hyperbolic tangent of *z*.


Classification functions
------------------------

.. function:: isfinite(z)

   Return ``True`` if both the real and imaginary parts of *z* are finite, and
   ``False`` otherwise.

   .. versionadded:: 3.2


.. function:: isinf(z)

   Return ``True`` if either the real or the imaginary part of *z* is an
   infinity, and ``False`` otherwise.


.. function:: isnan(z)

   Return ``True`` if either the real or the imaginary part of *z* is a NaN,
   and ``False`` otherwise.


.. function:: isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

   Return ``True`` if the values *a* and *b* are close to each other and
   ``False`` otherwise.

   Whether or not two values are considered close is determined according to
   given absolute and relative tolerances.  If no errors occur, the result will
   be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``.

   *rel_tol* is the relative tolerance -- it is the maximum allowed difference
   between *a* and *b*, relative to the larger absolute value of *a* or *b*.
   For example, to set a tolerance of 5%, pass ``rel_tol=0.05``.  The default
   tolerance is ``1e-09``, which assures that the two values are the same
   within about 9 decimal digits.  *rel_tol* must be nonnegative and less
   than ``1.0``.

   *abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be
   nonnegative.  When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed
   as ``abs(x) <= rel_tol  * abs(x)``, which is ``False`` for any ``x`` and
   rel_tol less than ``1.0``.  So add an appropriate positive abs_tol argument
   to the call.

   The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be
   handled according to IEEE rules.  Specifically, ``NaN`` is not considered
   close to any other value, including ``NaN``.  ``inf`` and ``-inf`` are only
   considered close to themselves.

   .. versionadded:: 3.5

   .. seealso::

      :pep:`485` -- A function for testing approximate equality


Constants
---------

.. data:: pi

   The mathematical constant *π*, as a float.


.. data:: e

   The mathematical constant *e*, as a float.


.. data:: tau

   The mathematical constant *τ*, as a float.

   .. versionadded:: 3.6


.. data:: inf

   Floating-point positive infinity. Equivalent to ``float('inf')``.

   .. versionadded:: 3.6


.. data:: infj

   Complex number with zero real part and positive infinity imaginary
   part. Equivalent to ``complex(0.0, float('inf'))``.

   .. versionadded:: 3.6


.. data:: nan

   A floating-point "not a number" (NaN) value.  Equivalent to
   ``float('nan')``. See also :data:`math.nan`.

   .. versionadded:: 3.6


.. data:: nanj

   Complex number with zero real part and NaN imaginary part. Equivalent to
   ``complex(0.0, float('nan'))``.

   .. versionadded:: 3.6


.. index:: pair: module; math

Note that the selection of functions is similar, but not identical, to that in
module :mod:`math`.  The reason for having two modules is that some users aren't
interested in complex numbers, and perhaps don't even know what they are.  They
would rather have ``math.sqrt(-1)`` raise an exception than return a complex
number. Also note that the functions defined in :mod:`cmath` always return a
complex number, even if the answer can be expressed as a real number (in which
case the complex number has an imaginary part of zero).

A note on branch cuts: They are curves along which the given function fails to
be continuous.  They are a necessary feature of many complex functions.  It is
assumed that if you need to compute with complex functions, you will understand
about branch cuts.  Consult almost any (not too elementary) book on complex
variables for enlightenment.  For information of the proper choice of branch
cuts for numerical purposes, a good reference should be the following:


.. seealso::

   Kahan, W:  Branch cuts for complex elementary functions; or, Much ado about
   nothing's sign bit.  In Iserles, A., and Powell, M. (eds.), The state of the art
   in numerical analysis. Clarendon Press (1987) pp165--211.
