complex.md
1> **Источник:** https://python-all.ru/3.14/c-api/complex.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты комплексных чисел89Объекты комплексных чисел в Python реализованы как два различных типа с точки зрения C API: один – это объект Python, доступный программам Python, а другой – структура C, представляющая фактическое значение комплексного числа. API предоставляет функции для работы с обоими.1011## Комплексные числа как C-структуры1213Обратите внимание, что функции, которые принимают эти структуры как параметры и возвращают их как результаты, делают это *по значению*, а не через разыменование указателей. Это единообразно во всём API.1415#### `type Py_complex`1617Структура C, которая соответствует части значения объекта Python комплексного числа. Большинство функций для работы с объектами комплексных чисел используют структуры этого типа в качестве входных или выходных значений, по мере необходимости.1819#### `double real`2021#### `double imag`2223Структура определяется как:2425```c26typedef struct {27 double real;28 double imag;29} Py_complex;30```3132#### `Py_complex _Py_c_sum(Py_complex left, Py_complex right)`3334Возвращает сумму двух комплексных чисел, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).3536#### `Py_complex _Py_c_diff(Py_complex left, Py_complex right)`3738Возвращает разность двух комплексных чисел, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).3940#### `Py_complex _Py_c_neg(Py_complex num)`4142Возвращает отрицание комплексного числа *num*, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).4344#### `Py_complex _Py_c_prod(Py_complex left, Py_complex right)`4546Возвращает произведение двух комплексных чисел, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).4748#### `Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)`4950Возвращает частное двух комплексных чисел, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).5152Если *divisor* равен нулю, метод возвращает ноль и устанавливает `errno` в `EDOM`.5354#### `Py_complex _Py_c_pow(Py_complex num, Py_complex exp)`5556Возвращает возведение *num* в степень *exp*, используя C-представление [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex).5758Если *num* равен нулю, а *exp* не является положительным действительным числом, метод возвращает ноль и устанавливает `errno` в `EDOM`.5960Устанавливает `errno` в `ERANGE` при переполнениях.6162## Комплексные числа как объекты Python6364#### `type PyComplexObject`6566Этот подтип [`PyObject`](https://python-all.ru/3.14/c-api/structures.html#c.PyObject) представляет объект комплексного числа Python.6768#### `PyTypeObject PyComplex_Type`6970*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*7172Этот экземпляр [`PyTypeObject`](https://python-all.ru/3.14/c-api/type.html#c.PyTypeObject) представляет тип комплексного числа Python. Это тот же объект, что и [`complex`](https://python-all.ru/3.14/library/functions.html#complex) в слое Python.7374#### `int PyComplex_Check(PyObject *p)`7576Возвращает истину, если аргумент является [`PyComplexObject`](https://python-all.ru/3.14/c-api/complex.html#c.PyComplexObject) или подтипом `PyComplexObject`. Эта функция всегда завершается успешно.7778#### `int PyComplex_CheckExact(PyObject *p)`7980Возвращает истину, если аргумент является [`PyComplexObject`](https://python-all.ru/3.14/c-api/complex.html#c.PyComplexObject), но не подтипом `PyComplexObject`. Эта функция всегда завершается успешно.8182#### `PyObject *PyComplex_FromCComplex(Py_complex v)`8384*Возвращаемое значение: новая ссылка.*8586Создаёт новый объект комплексного числа Python из значения C [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex). Возвращает `NULL` с установленным исключением в случае ошибки.8788#### `PyObject *PyComplex_FromDoubles(double real, double imag)`8990*Возвращаемое значение: новая ссылка.*9192*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*9394Возвращает новый объект [`PyComplexObject`](https://python-all.ru/3.14/c-api/complex.html#c.PyComplexObject) из *real* и *imag*. В случае ошибки возвращает `NULL` с установленным исключением.9596#### `double PyComplex_RealAsDouble(PyObject *op)`9798*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*99100Возвращает действительную часть *op* как C double.101102Если *op* не является объектом комплексного числа Python, но имеет метод [`__complex__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__complex__), этот метод будет сначала вызван для преобразования *op* в объект комплексного числа Python. Если `__complex__()` не определён, то выполняется вызов [`PyFloat_AsDouble()`](https://python-all.ru/3.14/c-api/float.html#c.PyFloat_AsDouble) и возвращается его результат.103104При сбое этот метод возвращает `-1.0` с установленным исключением, поэтому следует вызвать [`PyErr_Occurred()`](https://python-all.ru/3.14/c-api/exceptions.html#c.PyErr_Occurred) для проверки ошибок.105106Изменено в версии 3.13: Используйте [`__complex__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__complex__), если доступно.107108#### `double PyComplex_ImagAsDouble(PyObject *op)`109110*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*111112Возвращает мнимую часть *op* как C double.113114Если *op* не является объектом комплексного числа Python, но имеет метод [`__complex__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__complex__), этот метод будет сначала вызван для преобразования *op* в объект комплексного числа Python. Если `__complex__()` не определён, то выполняется вызов [`PyFloat_AsDouble()`](https://python-all.ru/3.14/c-api/float.html#c.PyFloat_AsDouble) и в случае успеха возвращается `0.0`.115116При сбое этот метод возвращает `-1.0` с установленным исключением, поэтому следует вызвать [`PyErr_Occurred()`](https://python-all.ru/3.14/c-api/exceptions.html#c.PyErr_Occurred) для проверки ошибок.117118Изменено в версии 3.13: Используйте [`__complex__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__complex__), если доступно.119120#### `Py_complex PyComplex_AsCComplex(PyObject *op)`121122Возвращает значение [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex) комплексного числа *op*.123124Если *op* не является объектом комплексного числа Python, но имеет метод [`__complex__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__complex__), сначала вызывается этот метод для преобразования *op* в объект комплексного числа Python. Если `__complex__()` не определён, используется [`__float__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__float__). Если `__float__()` не определён, используется [`__index__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__index__).125126В случае ошибки метод возвращает [`Py_complex`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex) с [`real`](https://python-all.ru/3.14/c-api/complex.html#c.Py_complex.real), установленным в `-1.0`, и с установленным исключением, поэтому для проверки ошибок следует вызвать [`PyErr_Occurred()`](https://python-all.ru/3.14/c-api/exceptions.html#c.PyErr_Occurred).127128Изменено в версии 3.8: Используйте [`__index__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__index__), если доступно.129