Đối tượng số phức

Các đối tượng số phức của Python được triển khai thành hai loại riêng biệt khi xem từ C API: một là đối tượng Python được hiển thị với các chương trình Python và loại kia là cấu trúc C đại diện cho giá trị số phức thực tế. Zz001zz cung cấp các chức năng để làm việc với cả hai.

Số phức dưới dạng cấu trúc C

Lưu ý rằng các hàm chấp nhận các cấu trúc này làm tham số và trả về chúng dưới dạng kết quả sẽ làm như vậy by value thay vì hủy tham chiếu chúng thông qua con trỏ. Điều này nhất quán trong suốt API.

type Py_complex

Cấu trúc C tương ứng với phần giá trị của đối tượng số phức Python. Hầu hết các hàm xử lý các đối tượng số phức đều sử dụng các cấu trúc thuộc loại này làm giá trị đầu vào hoặc đầu ra, nếu thích hợp.

double real
double imag

Cấu trúc được định nghĩa là:

cấu trúc typedef {
    thực gấp đôi;
    hình ảnh kép;
} Py_complex;
Py_complex _Py_c_sum(Py_complex left, Py_complex right)

Trả về tổng của hai số phức, sử dụng biểu diễn C Py_complex.

Py_complex _Py_c_diff(Py_complex left, Py_complex right)

Trả về hiệu giữa hai số phức, sử dụng biểu diễn C Py_complex.

Py_complex _Py_c_neg(Py_complex num)

Trả về số âm của số phức num, sử dụng biểu diễn C Py_complex.

Py_complex _Py_c_prod(Py_complex left, Py_complex right)

Trả về tích của hai số phức, sử dụng biểu diễn C Py_complex.

Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)

Trả về thương số của hai số phức, sử dụng biểu diễn C Py_complex.

Nếu divisor là null, phương thức này trả về 0 và đặt errno thành EDOM.

Py_complex _Py_c_pow(Py_complex num, Py_complex exp)

Trả về số mũ của num theo exp, sử dụng biểu diễn C Py_complex.

Nếu num là null và exp không phải là số thực dương thì phương thức này trả về 0 và đặt errno thành EDOM.

Đặt errno thành ERANGE khi tràn.

Số phức dưới dạng đối tượng Python

type PyComplexObject

Kiểu con này của PyObject đại diện cho một đối tượng số phức Python.

PyTypeObject PyComplex_Type
Một phần của ABI ổn định.

Phiên bản PyTypeObject này đại diện cho kiểu số phức Python. Nó là đối tượng tương tự như complex trong lớp Python.

int PyComplex_Check(PyObject *p)

Trả về true nếu đối số của nó là PyComplexObject hoặc kiểu con của PyComplexObject. Chức năng này luôn thành công.

int PyComplex_CheckExact(PyObject *p)

Trả về true nếu đối số của nó là PyComplexObject nhưng không phải là kiểu con của PyComplexObject. Chức năng này luôn thành công.

PyObject *PyComplex_FromCComplex(Py_complex v)
Giá trị trả về: Tham chiếu mới.

Tạo một đối tượng số phức Python mới từ giá trị C Py_complex. Trả về NULL với lỗi ngoại lệ được đặt.

PyObject *PyComplex_FromDoubles(double real, double imag)
Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.

Trả về một đối tượng PyComplexObject mới từ realimag. Trả về NULL với lỗi ngoại lệ được đặt.

double PyComplex_RealAsDouble(PyObject *op)
Một phần của ABI ổn định.

Trả lại phần thực của op dưới dạng C double.

Nếu op không phải là đối tượng số phức Python nhưng có phương thức __complex__(), thì trước tiên, phương thức này sẽ được gọi để chuyển đổi op thành đối tượng số phức Python. Nếu __complex__() không được xác định thì nó sẽ quay lại gọi PyFloat_AsDouble() và trả về kết quả của nó.

Khi thất bại, phương thức này trả về -1.0 với một bộ ngoại lệ, vì vậy người ta nên gọi PyErr_Occurred() để kiểm tra lỗi.

Thay đổi trong phiên bản 3.13: Sử dụng __complex__() nếu có.

double PyComplex_ImagAsDouble(PyObject *op)
Một phần của ABI ổn định.

Trả về phần ảo của op dưới dạng C double.

Nếu op không phải là đối tượng số phức Python nhưng có phương thức __complex__(), thì trước tiên, phương thức này sẽ được gọi để chuyển đổi op thành đối tượng số phức Python. Nếu __complex__() không được xác định thì nó sẽ quay lại gọi PyFloat_AsDouble() và trả về 0.0 nếu thành công.

Khi thất bại, phương thức này trả về -1.0 với một bộ ngoại lệ, vì vậy người ta nên gọi PyErr_Occurred() để kiểm tra lỗi.

Thay đổi trong phiên bản 3.13: Sử dụng __complex__() nếu có.

Py_complex PyComplex_AsCComplex(PyObject *op)

Trả về giá trị Py_complex của số phức op.

Nếu op không phải là đối tượng số phức Python nhưng có phương thức __complex__(), thì trước tiên, phương thức này sẽ được gọi để chuyển đổi op thành đối tượng số phức Python. Nếu __complex__() không được xác định thì nó sẽ quay trở lại __float__(). Nếu __float__() không được xác định thì nó sẽ quay trở lại __index__().

Khi thất bại, phương thức này trả về Py_complex với real được đặt thành -1.0 và với một bộ ngoại lệ, vì vậy người ta nên gọi PyErr_Occurred() để kiểm tra lỗi.

Thay đổi trong phiên bản 3.8: Sử dụng __index__() nếu có.