複素数オブジェクト
******************

Python's complex number objects are implemented as two distinct types
when viewed from the C API:  one is the Python object exposed to
Python programs, and the other is a C structure which represents the
actual complex number value. The API provides functions for working
with both.


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

Note that the functions which accept these structures as parameters
and return them as results do so *by value* rather than dereferencing
them through pointers.  This is consistent throughout the 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.

   double real
   double imag

   The structure 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" をセットします。

   Set "errno" to "ERANGE" on overflows.


Complex Numbers as Python Objects
=================================

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. Return "NULL" with an exception set on error.

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

   Return a new "PyComplexObject" object from *real* and *imag*.
   Return "NULL" with an exception set on error.

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

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

   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 call "PyFloat_AsDouble()" and returns
   its result.

   Upon failure, this method returns "-1.0" with an exception set, so
   one should call "PyErr_Occurred()" to check for errors.

   バージョン 3.13 で変更: Use "__complex__()" if available.

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

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

   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 call "PyFloat_AsDouble()" and returns
   "0.0" on success.

   Upon failure, this method returns "-1.0" with an exception set, so
   one should call "PyErr_Occurred()" to check for errors.

   バージョン 3.13 で変更: Use "__complex__()" if available.

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 "Py_complex" with "real" set to
   "-1.0" and with an exception set, so one should call
   "PyErr_Occurred()" to check for errors.

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