float.md
1> **Источник:** https://python-all.ru/3.11/c-api/float.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты с плавающей запятой89#### `type PyFloatObject`1011Этот подтип [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject) представляет объект Python с плавающей запятой.1213#### `PyTypeObject PyFloat_Type`1415*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*1617Этот экземпляр [`PyTypeObject`](https://python-all.ru/3.11/c-api/type.html#c.PyTypeObject) представляет тип с плавающей запятой Python. Это тот же объект, что и [`float`](https://python-all.ru/3.11/library/functions.html#float) на уровне Python.1819#### `int PyFloat_Check(PyObject *p)`2021Возвращает истину, если аргумент является [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject) или подтипом [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject). Эта функция всегда завершается успешно.2223#### `int PyFloat_CheckExact(PyObject *p)`2425Возвращает истину, если аргумент является [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject), но не подтипом [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject). Эта функция всегда завершается успешно.2627#### `PyObject *PyFloat_FromString(PyObject *str)`2829*Возвращаемое значение: новая ссылка.*3031*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*3233Создаёт объект [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject) на основе строкового значения *str* или `NULL` в случае ошибки.3435#### `PyObject *PyFloat_FromDouble(double v)`3637*Возвращаемое значение: новая ссылка.*3839*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*4041Создаёт объект [`PyFloatObject`](https://python-all.ru/3.11/c-api/float.html#c.PyFloatObject) из *v* или `NULL` в случае ошибки.4243#### `double PyFloat_AsDouble(PyObject *pyfloat)`4445*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*4647Возвращает представление типа C double содержимого *pyfloat*. Если *pyfloat* не является объектом с плавающей запятой Python, но имеет метод [`__float__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__float__), этот метод будет сначала вызван для преобразования *pyfloat* в число с плавающей запятой. Если `__float__()` не определён, используется [`__index__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__index__). Этот метод возвращает `-1.0` в случае ошибки, поэтому следует вызывать [`PyErr_Occurred()`](https://python-all.ru/3.11/c-api/exceptions.html#c.PyErr_Occurred) для проверки на ошибки.4849Изменено в версии 3.8: Используйте [`__index__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__index__), если доступно.5051#### `double PyFloat_AS_DOUBLE(PyObject *pyfloat)`5253Возвращает представление содержимого *pyfloat* в виде C double, но без проверки ошибок.5455#### `PyObject *PyFloat_GetInfo(void)`5657*Возвращаемое значение: новая ссылка.*5859*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*6061Возвращает экземпляр structseq, содержащий информацию о точности, минимальном и максимальном значениях числа с плавающей запятой. Это тонкая обёртка вокруг заголовочного файла `float.h`.6263#### `double PyFloat_GetMax()`6465*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*6667Возвращает максимальное представимое конечное число с плавающей запятой *DBL\_MAX* в виде C double.6869#### `double PyFloat_GetMin()`7071*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*7273Возвращает минимальное нормализованное положительное число с плавающей запятой *DBL\_MIN* в виде C double.7475## Функции упаковки и распаковки7677Функции pack и unpack предоставляют эффективный независимый от платформы способ хранения чисел с плавающей запятой в виде строк байтов. Процедуры Pack создают строку байтов из C double, а процедуры Unpack создают C double из такой строки байтов. Суффикс (2, 4 или 8) задает количество байтов в строке байтов.7879На платформах, которые, как считается, используют форматы IEEE 754, эти функции работают путем копирования битов. На других платформах 2-байтовый формат идентичен формату IEEE 754 binary16 (половинная точность), 4-байтовый формат (32-битный) идентичен формату IEEE 754 binary32 (одинарная точность), а 8-байтовый формат – формату IEEE 754 binary64 (двойная точность), хотя упаковка INF и NaN (если такие существуют на платформе) обрабатывается некорректно, и попытка распаковать строку байтов, содержащую IEEE INF или NaN, вызовет исключение.8081На не-IEEE платформах с большей точностью или большим динамическим диапазоном, чем поддерживает IEEE 754, не все значения можно упаковать; на не-IEEE платформах с меньшей точностью или меньшим динамическим диапазоном не все значения можно распаковать. Что происходит в таких случаях, отчасти случайно (увы).8283Новое в версии 3.11.8485### Функции упаковки8687Функции упаковки записывают 2, 4 или 8 байт, начиная с *p*. *le* – это аргумент типа int; ненулевое значение означает, что строку байт нужно в формате little-endian (порядок от младшего к старшему: экспонента последней, на `p+1`, `p+3` или `p+6` `p+7`), ноль – формат big-endian (экспонента первой, на *p*). Константу `PY_BIG_ENDIAN` можно использовать для выбора нативного порядка байт: она равна `1` на процессоре с big endian и `0` на процессоре с little endian.8889Возвращаемое значение: `0`, если всё в порядке, `-1`, если произошла ошибка (при этом устанавливается исключение, скорее всего [`OverflowError`](https://python-all.ru/3.11/library/exceptions.html#OverflowError)).9091На платформах, не поддерживающих IEEE, есть две проблемы:9293- Результат этой операции не определён, если *x* является NaN или бесконечностью.94- `-0.0` и `+0.0` дают одну и ту же строку байт.9596#### `int PyFloat_Pack2(double x, unsigned char *p, int le)`9798Упаковывает C double в формат IEEE 754 binary16 (половинная точность).99100#### `int PyFloat_Pack4(double x, unsigned char *p, int le)`101102Упаковывает C double в формат IEEE 754 binary32 (одинарная точность).103104#### `int PyFloat_Pack8(double x, unsigned char *p, int le)`105106Упаковывает C double в формат IEEE 754 binary64 (двойная точность).107108### Функции распаковки109110Функции распаковки читают 2, 4 или 8 байт, начиная с *p*. *le* – это аргумент типа int; он не равен нулю, если строка байт имеет формат little-endian (экспонента последняя, на позициях `p+1`, `p+3`, `p+6` и `p+7`), и равен нулю для big-endian (экспонента первая, на позиции *p*). Константу `PY_BIG_ENDIAN` можно использовать для выбора порядка, соответствующего архитектуре: она равна `1` на процессоре с big-endian, или `0` на процессоре с little-endian.111112Возвращаемое значение: распакованное число double. В случае ошибки возвращается `-1.0`, а [`PyErr_Occurred()`](https://python-all.ru/3.11/c-api/exceptions.html#c.PyErr_Occurred) становится истинным (при этом устанавливается исключение, скорее всего [`OverflowError`](https://python-all.ru/3.11/library/exceptions.html#OverflowError)).113114Обратите внимание: на платформе, не поддерживающей IEEE, эта функция откажется распаковывать строку байт, которая представляет NaN или бесконечность.115116#### `double PyFloat_Unpack2(const unsigned char *p, int le)`117118Распаковывает формат IEEE 754 binary16 (половинная точность) в C double.119120#### `double PyFloat_Unpack4(const unsigned char *p, int le)`121122Распаковывает формат IEEE 754 binary32 (одинарная точность) в C double.123124#### `double PyFloat_Unpack8(const unsigned char *p, int le)`125126Распаковывает формат IEEE 754 binary64 (двойная точность) в C double.127