Complex Number Objects¶
Python’s complex number objects are implemented as two distinct types whenviewed from the C API: one is the Python object exposed to Python programs, andthe other is a C structure which represents the actual complex number value.The API provides functions for working with both.
Complex Numbers as C Structures¶
Note that the functions which accept these structures as parameters and returnthem as results do soby value rather than dereferencing them throughpointers. This is consistent throughout the API.
- typePy_complex¶
The C structure which corresponds to the value portion of a Python complexnumber object. Most of the functions for dealing with complex number objectsuse structures of this type as input or output values, as appropriate.
The structure is defined as:
typedefstruct{doublereal;doubleimag;}Py_complex;
- Py_complex_Py_c_sum(Py_complexleft,Py_complexright)¶
Return the sum of two complex numbers, using the C
Py_complex
representation.
- Py_complex_Py_c_diff(Py_complexleft,Py_complexright)¶
Return the difference between two complex numbers, using the C
Py_complex
representation.
- Py_complex_Py_c_neg(Py_complexnum)¶
Return the negation of the complex numbernum, using the C
Py_complex
representation.
- Py_complex_Py_c_prod(Py_complexleft,Py_complexright)¶
Return the product of two complex numbers, using the C
Py_complex
representation.
- Py_complex_Py_c_quot(Py_complexdividend,Py_complexdivisor)¶
Return the quotient of two complex numbers, using the C
Py_complex
representation.Ifdivisor is null, this method returns zero and sets
errno
toEDOM
.
- Py_complex_Py_c_pow(Py_complexnum,Py_complexexp)¶
Return the exponentiation ofnum byexp, using the C
Py_complex
representation.Ifnum is null andexp is not a positive real number,this method returns zero and sets
errno
toEDOM
.
Complex Numbers as Python Objects¶
- PyTypeObjectPyComplex_Type¶
- Part of theStable ABI.
This instance of
PyTypeObject
represents the Python complex numbertype. It is the same object ascomplex
in the Python layer.
- intPyComplex_Check(PyObject*p)¶
Return true if its argument is a
PyComplexObject
or a subtype ofPyComplexObject
. This function always succeeds.
- intPyComplex_CheckExact(PyObject*p)¶
Return true if its argument is a
PyComplexObject
, but not a subtype ofPyComplexObject
. This function always succeeds.
- PyObject*PyComplex_FromCComplex(Py_complexv)¶
- Return value: New reference.
Create a new Python complex number object from a C
Py_complex
value.ReturnNULL
with an exception set on error.
- PyObject*PyComplex_FromDoubles(doublereal,doubleimag)¶
- Return value: New reference. Part of theStable ABI.
Return a new
PyComplexObject
object fromreal andimag.ReturnNULL
with an exception set on error.
- doublePyComplex_RealAsDouble(PyObject*op)¶
- Part of theStable ABI.
Return the real part ofop as a Cdouble.
Ifop is not a Python complex number object but has a
__complex__()
method, this method will first be called toconvertop to a Python complex number object. If__complex__()
isnot defined then it falls back to callPyFloat_AsDouble()
andreturns its result.Upon failure, this method returns
-1.0
with an exception set, so oneshould callPyErr_Occurred()
to check for errors.Changed in version 3.13:Use
__complex__()
if available.
- doublePyComplex_ImagAsDouble(PyObject*op)¶
- Part of theStable ABI.
Return the imaginary part ofop as a Cdouble.
Ifop is not a Python complex number object but has a
__complex__()
method, this method will first be called toconvertop to a Python complex number object. If__complex__()
isnot defined then it falls back to callPyFloat_AsDouble()
andreturns0.0
on success.Upon failure, this method returns
-1.0
with an exception set, so oneshould callPyErr_Occurred()
to check for errors.Changed in version 3.13:Use
__complex__()
if available.
- Py_complexPyComplex_AsCComplex(PyObject*op)¶
Return the
Py_complex
value of the complex numberop.Ifop is not a Python complex number object but has a
__complex__()
method, this method will first be called to convertop to a Python complexnumber object. If__complex__()
is not defined then it falls back to__float__()
. If__float__()
is not defined then it falls backto__index__()
.Upon failure, this method returns
Py_complex
withreal
set to-1.0
and with an exception set, so oneshould callPyErr_Occurred()
to check for errors.Changed in version 3.8:Use
__index__()
if available.