Objets représentant des nombres complexes
*****************************************

Les nombres complexes Python sont implémentés comme deux types
distincts, lorsqu'ils sont vus de l'API C : l'un est l'objet Python
tel qu'il est vu par les programmes Python, et l'autre est une
structure C qui représente la valeur exacte du nombre complexe. L'API
fournit des fonctions pour travailler avec ces deux représentations.


Nombres complexes en tant que structures C
==========================================

Les fonctions qui acceptent ces structures comme paramètres et les
renvoient comme résultats le font en fonction de leur *valeur* au lieu
de les dé-référencer en utilisant des pointeurs. C'est constant dans
toute l'API.

Py_complex

   Structure C représentant la valeur d'un nombre complexe Python. La
   majorité des fonctions qui traitent des nombres complexes utilisent
   cette structure en entrée ou en sortie, selon le cas. Elle est
   définie par :

      typedef struct {
         double real;
         double imag;
      } Py_complex;

Py_complex _Py_c_sum(Py_complex left, Py_complex right)

   Renvoie la somme de deux nombres complexes, sous la forme d'un
   "Py_complex" en C.

Py_complex _Py_c_diff(Py_complex left, Py_complex right)

   Renvoie la différence de deux nombres complexes, sous la forme d'un
   "Py_complex" en C.

Py_complex _Py_c_neg(Py_complex complex)

   Renvoie l'opposé du nombre complexe *complex*, sous la forme d'un
   "Py_complex" en C.

Py_complex _Py_c_prod(Py_complex left, Py_complex right)

   Renvoie le produit de deux nombres complexes, sous la forme d'un
   "Py_complex" en C.

Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)

   Renvoie le quotient de deux nombres complexes, sous la forme d'un
   "Py_complex" en C.

   Si *divisor* est nul, cette méthode renvoie zéro et assigne "EDOM"
   à "errno".

Py_complex _Py_c_pow(Py_complex num, Py_complex exp)

   Renvoie *num* à la puissance *exp*, sous la forme d'un "Py_complex"
   en C.

   Si *num* est nul et *exp* n'est pas un nombre réel positif, cette
   méthode renvoie zéro et assigne "EDOM" à "errno".


Nombres complexes en tant qu'objets Python
==========================================

PyComplexObject

   Ce sous-type de l'objet "PyObject" représente un nombre complexe en
   Python.

PyTypeObject PyComplex_Type

   Cette instance de "PyTypeObject" représente le type nombre complexe
   Python. C'est le même objet que la classe "complex" de la couche
   Python.

int PyComplex_Check(PyObject *p)

   Renvoie vrai si l'argument est de type "PyComplexObject" ou un
   sous-type de "PyComplexObject".

int PyComplex_CheckExact(PyObject *p)

   Renvoie vrai si l'argument est de type "PyComplexObject", mais pas
   un sous-type de "PyComplexObject".

PyObject* PyComplex_FromCComplex(Py_complex v)
    *Return value: New reference.*

   Crée un nouveau nombre complexe à partir de la valeur d'un
   "Py_complex" en C.

PyObject* PyComplex_FromDoubles(double real, double imag)
    *Return value: New reference.*

   Renvoie un nouveau "PyComplexObject" à partir de *real* et de
   *imag*.

double PyComplex_RealAsDouble(PyObject *op)

   Renvoie la partie réelle du nombre complexe *op* sous la forme d'un
   "double" en C.

double PyComplex_ImagAsDouble(PyObject *op)

   Renvoie la partie imaginaire du nombre complexe *op* sous la forme
   d'un "double" en C.

Py_complex PyComplex_AsCComplex(PyObject *op)

   Renvoie la valeur du nombre complexe *op* sous la forme d'un
   "Py_complex" en C.

   Si *op* n'est pas un nombre complexe Python mais a une méthode
   "__complex__()", cette méthode est d'abord appelée pour convertir
   *op* en nombre complexe Python. En cas d'échec, cette méthode
   renvoie "-1.0" en tant que nombre réel.
