# 複素数オブジェクト

Python の複素数オブジェクトは、C API 側から見ると二つの別個の型として実装されています: 一方は Python プログラムに対して公開されている Python のオブジェクトで、他方は実際の複素数値を表現する C の構造体です。API では、これら双方を扱う関数を提供しています。

## C 構造体としての複素数

複素数の C 構造体を引数として受理したり、戻り値として返したりする関数は、ポインタ渡しを行うのではなく 値渡し を行うので注意してください。これは API 全体を通して一貫しています。

type Py_complex

  The C structure which corresponds to the value portion of a Python complex number object. Most of the functions for dealing with complex number objects use structures of this type as input or output values, as appropriate. It is defined as:

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

Py_complex _Py_c_sum(Py_complex left, Py_complex right)

  二つの複素数の和を C の `Py_complex` 型で返します。

Py_complex _Py_c_diff(Py_complex left, Py_complex right)

  二つの複素数の差を C の `Py_complex` 型で返します。

Py_complex _Py_c_neg(Py_complex num)

  複素数 num の符号反転 C の `Py_complex` 型で返します。

Py_complex _Py_c_prod(Py_complex left, Py_complex right)

  二つの複素数の積を C の `Py_complex` 型で返します。

Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)

  二つの複素数の商を C の `Py_complex` 型で返します。

  divisor が null の場合は、このメソッドはゼロを返し、 `errno` に `EDOM` をセットします。

Py_complex _Py_c_pow(Py_complex num, Py_complex exp)

  指数 exp の num 乗を C の `Py_complex` 型で返します。

  num が null で exp が正の実数でない場合は、このメソッドはゼロを返し、 `errno` に `EDOM` をセットします。

## Python オブジェクトとしての複素数型

type PyComplexObject

  この `PyObject` のサブタイプは Python の複素数型を表現します。

PyTypeObject PyComplex_Type
  次に属します: Stable ABI.

  この `PyTypeObject` のインスタンスは Python の複素数型を表現します。 Pythonレイヤの `complex` と同じオブジェクトです。

int PyComplex_Check(PyObject *p)

  引数が `PyComplexObject` か `PyComplexObject` のサブタイプであるときに真を返します。この関数は常に成功します。

int PyComplex_CheckExact(PyObject *p)

  引数が `PyComplexObject` であるが `PyComplexObject` のサブタイプでないときに真を返します。この関数は常に成功します。

PyObject *PyComplex_FromCComplex(Py_complex v)
  戻り値: 新しい参照。

  Create a new Python complex number object from a C `Py_complex` value.

PyObject *PyComplex_FromDoubles(double real, double imag)
  戻り値: 新しい参照。 次に属します: Stable ABI.

  Return a new `PyComplexObject` object from real and imag.

double PyComplex_RealAsDouble(PyObject *op)
  次に属します: Stable ABI.

  op の実数部分を C の double 型で返します。

double PyComplex_ImagAsDouble(PyObject *op)
  次に属します: Stable ABI.

  op の虚数部分を C の double 型で返します。

Py_complex PyComplex_AsCComplex(PyObject *op)

  複素数値 op から `Py_complex` 型を生成します。

  If op is not a Python complex number object but has a `__complex__()` method, this method will first be called to convert op to a Python complex number object. If `__complex__()` is not defined then it falls back to `__float__()`. If `__float__()` is not defined then it falls back to `__index__()`. Upon failure, this method returns `-1.0` as a real value.

  バージョン 3.8 で変更: 可能であれば `__index__()` を使うようになりました。