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

type PyComplexObject

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

   Py_complex cval

      C の "Py_complex" 表現による複素数の値。

      バージョン 3.15 で非推奨、バージョン 3.20 で削除予定: Python の
      複素数と C の "Py_complex" 表現を相互に変換するには、
      "PyComplex_AsCComplex()" と "PyComplex_FromCComplex()" を使って
      ください。

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_FromDoubles(double real, double imag)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   *real* と *imag* から新しい "PyComplexObject" オブジェクトを作成し
   て返します。 エラーの場合は例外を設定して "NULL" を返します。

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

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

   *op* が Python の複素数オブジェクトでなく、"__complex__()" メソッド
   を持つ場合は、まずこのメソッドを呼び出し、*op* を Python の複素数オ
   ブジェクトに変換します。 "__complex__()" が定義されていなければ、代
   わりに "PyFloat_AsDouble()" を呼び出し、その結果を返します。

   失敗すると、例外を設定して "-1.0" を返します。 そのため、エラーの有
   無を確認するには "PyErr_Occurred()" を呼び出してください。

   バージョン 3.13 で変更: 利用可能なら "__complex__()" を使うようにな
   りました。

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

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

   *op* が Python の複素数オブジェクトでなく、"__complex__()" メソッド
   を持つ場合は、まずこのメソッドを呼び出し、*op* を Python の複素数オ
   ブジェクトに変換します。 "__complex__()" が定義されていなければ、代
   わりに "PyFloat_AsDouble()" を呼び出し、成功時に "0.0" を返します。

   失敗すると、例外を設定して "-1.0" を返します。 そのため、エラーの有
   無を確認するには "PyErr_Occurred()" を呼び出してください。

   バージョン 3.13 で変更: 利用可能なら "__complex__()" を使うようにな
   りました。

type Py_complex

   この C 構造体は、Python の複素数オブジェクトをエクスポートする形式
   を定義します。

   double real
   double imag

   構造体は次のように定義されています。

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

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

   C の "Py_complex" 値から、新しい Python の複素数オブジェクトを作成
   します。 エラーの場合は例外を設定して "NULL" を返します。

Py_complex PyComplex_AsCComplex(PyObject *op)

   複素数 *op* の値を "Py_complex" として返します。

   *op* が Python の複素数オブジェクトでなく、"__complex__()" メソッド
   を持つ場合は、まずこのメソッドを呼び出し、*op* を Python の複素数オ
   ブジェクトに変換します。 "__complex__()" が定義されていなければ、代
   わりに "__float__()" を使います。 "__float__()" も定義されていなけ
   れば、代わりに "__index__()" を使います。

   失敗すると、例外を設定し、"real" を "-1.0" にした "Py_complex" を返
   します。 そのため、エラーの有無を確認するには "PyErr_Occurred()" を
   呼び出してください。

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


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

この API は、"Py_complex" 表現を使って複素数を扱う関数も提供します。
これらの構造体を引数として受け取り、結果として返す関数は、ポインタを介
して参照するのではなく、*値渡し* を行う点に注意してください。

これらの関数は Python 3.15 以降、*ソフト非推奨* です。 新しいコードで
は、複素数演算にこの API を使うのは避けてください。 代わりに 数値プロ
トコル の API を使うか、double complex などのネイティブな複素数型を使
ってください。

Py_complex _Py_c_sum(Py_complex left, Py_complex right)

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

   バージョン 3.15 で非推奨.

Py_complex _Py_c_diff(Py_complex left, Py_complex right)

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

   バージョン 3.15 で非推奨.

Py_complex _Py_c_neg(Py_complex num)

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

   バージョン 3.15 で非推奨.

Py_complex _Py_c_prod(Py_complex left, Py_complex right)

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

   バージョン 3.15 で非推奨.

Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)

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

   *divisor* がゼロの場合、この関数はゼロを返し、"errno" に "EDOM" を
   設定します。

   バージョン 3.15 で非推奨.

Py_complex _Py_c_pow(Py_complex num, Py_complex exp)

   *num* の *exp* 乗を、C の "Py_complex" 表現で返します。

   *num* がゼロで、*exp* が正の実数でない場合、この関数はゼロを返し、
   "errno" に "EDOM" を設定します。

   オーバーフロー時は "errno" に "ERANGE" を設定します。

   バージョン 3.15 で非推奨.

double _Py_c_abs(Py_complex num)

   複素数 *num* の絶対値を返します。

   オーバーフロー時は "errno" に "ERANGE" を設定します。

   バージョン 3.15 で非推奨.
