17db96d56Sopenharmony_ci.. highlight:: c
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci.. _complexobjects:
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciComplex Number Objects
67db96d56Sopenharmony_ci----------------------
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci.. index:: pair: object; complex number
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciPython's complex number objects are implemented as two distinct types when
117db96d56Sopenharmony_civiewed from the C API:  one is the Python object exposed to Python programs, and
127db96d56Sopenharmony_cithe other is a C structure which represents the actual complex number value.
137db96d56Sopenharmony_ciThe API provides functions for working with both.
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciComplex Numbers as C Structures
177db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciNote that the functions which accept these structures as parameters and return
207db96d56Sopenharmony_cithem as results do so *by value* rather than dereferencing them through
217db96d56Sopenharmony_cipointers.  This is consistent throughout the API.
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci.. c:type:: Py_complex
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci   The C structure which corresponds to the value portion of a Python complex
277db96d56Sopenharmony_ci   number object.  Most of the functions for dealing with complex number objects
287db96d56Sopenharmony_ci   use structures of this type as input or output values, as appropriate.  It is
297db96d56Sopenharmony_ci   defined as::
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci      typedef struct {
327db96d56Sopenharmony_ci         double real;
337db96d56Sopenharmony_ci         double imag;
347db96d56Sopenharmony_ci      } Py_complex;
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_sum(Py_complex left, Py_complex right)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci   Return the sum of two complex numbers, using the C :c:type:`Py_complex`
407db96d56Sopenharmony_ci   representation.
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_diff(Py_complex left, Py_complex right)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci   Return the difference between two complex numbers, using the C
467db96d56Sopenharmony_ci   :c:type:`Py_complex` representation.
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_neg(Py_complex num)
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci   Return the negation of the complex number *num*, using the C
527db96d56Sopenharmony_ci   :c:type:`Py_complex` representation.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_prod(Py_complex left, Py_complex right)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci   Return the product of two complex numbers, using the C :c:type:`Py_complex`
587db96d56Sopenharmony_ci   representation.
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci   Return the quotient of two complex numbers, using the C :c:type:`Py_complex`
647db96d56Sopenharmony_ci   representation.
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci   If *divisor* is null, this method returns zero and sets
677db96d56Sopenharmony_ci   :c:data:`errno` to :c:data:`EDOM`.
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci.. c:function:: Py_complex _Py_c_pow(Py_complex num, Py_complex exp)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci   Return the exponentiation of *num* by *exp*, using the C :c:type:`Py_complex`
737db96d56Sopenharmony_ci   representation.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   If *num* is null and *exp* is not a positive real number,
767db96d56Sopenharmony_ci   this method returns zero and sets :c:data:`errno` to :c:data:`EDOM`.
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ciComplex Numbers as Python Objects
807db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci.. c:type:: PyComplexObject
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci   This subtype of :c:type:`PyObject` represents a Python complex number object.
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci.. c:var:: PyTypeObject PyComplex_Type
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci   This instance of :c:type:`PyTypeObject` represents the Python complex number
917db96d56Sopenharmony_ci   type. It is the same object as :class:`complex` in the Python layer.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci.. c:function:: int PyComplex_Check(PyObject *p)
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci   Return true if its argument is a :c:type:`PyComplexObject` or a subtype of
977db96d56Sopenharmony_ci   :c:type:`PyComplexObject`.  This function always succeeds.
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci.. c:function:: int PyComplex_CheckExact(PyObject *p)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci   Return true if its argument is a :c:type:`PyComplexObject`, but not a subtype of
1037db96d56Sopenharmony_ci   :c:type:`PyComplexObject`.  This function always succeeds.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci.. c:function:: PyObject* PyComplex_FromCComplex(Py_complex v)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   Create a new Python complex number object from a C :c:type:`Py_complex` value.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. c:function:: PyObject* PyComplex_FromDoubles(double real, double imag)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   Return a new :c:type:`PyComplexObject` object from *real* and *imag*.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci.. c:function:: double PyComplex_RealAsDouble(PyObject *op)
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci   Return the real part of *op* as a C :c:expr:`double`.
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci.. c:function:: double PyComplex_ImagAsDouble(PyObject *op)
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci   Return the imaginary part of *op* as a C :c:expr:`double`.
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci.. c:function:: Py_complex PyComplex_AsCComplex(PyObject *op)
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci   Return the :c:type:`Py_complex` value of the complex number *op*.
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   If *op* is not a Python complex number object but has a :meth:`__complex__`
1317db96d56Sopenharmony_ci   method, this method will first be called to convert *op* to a Python complex
1327db96d56Sopenharmony_ci   number object.  If ``__complex__()`` is not defined then it falls back to
1337db96d56Sopenharmony_ci   :meth:`__float__`.  If ``__float__()`` is not defined then it falls back
1347db96d56Sopenharmony_ci   to :meth:`__index__`.  Upon failure, this method returns ``-1.0`` as a real
1357db96d56Sopenharmony_ci   value.
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   .. versionchanged:: 3.8
1387db96d56Sopenharmony_ci      Use :meth:`__index__` if available.
139