fpectl.md
1> **Источник:** https://python-all.ru/3.0/library/fpectl.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `fpectl` – Управление исключениями с плавающей запятой89*Платформы:* Unix1011> **Примечание**12>13> Модуль `fpectl` не собирается по умолчанию, его использование не рекомендуется и может быть опасным, за исключением случаев, когда это делают эксперты. См. также раздел [*Ограничения и прочие соображения*](https://python-all.ru/3.0/library/fpectl.html#fpectl-limitations) об ограничениях для получения дополнительной информации.1415Большинство компьютеров выполняют операции с плавающей запятой в соответствии с так называемым стандартом IEEE-754. На любом реальном компьютере некоторые операции с плавающей запятой дают результаты, которые невозможно выразить в виде обычного числа с плавающей запятой. Например, попробуйте1617```python18>>> import math19>>> math.exp(1000)20inf21>>> math.exp(1000) / math.exp(1000)22nan23```2425(Приведённый выше пример будет работать на многих платформах. DEC Alpha может быть исключением.) «Inf» – это специальное нечисловое значение в IEEE-754, обозначающее «бесконечность», а «nan» означает «не число». Обратите внимание, что, помимо нечисловых результатов, ничего особенного не произошло, когда вы попросили Python выполнить эти вычисления. На самом деле это поведение по умолчанию, предписанное стандартом IEEE-754, и если оно вас устраивает, прекратите чтение сейчас.2627В некоторых случаях было бы лучше возбудить исключение и остановить обработку в точке, где была предпринята ошибочная операция. Модуль `fpectl` предназначен для использования в таких ситуациях. Он предоставляет управление блоками операций с плавающей запятой от нескольких производителей оборудования, позволяя пользователю включить генерацию `SIGFPE` всякий раз, когда происходит любое из исключений IEEE-754: деление на ноль, переполнение или недопустимая операция. В сочетании с парой макросов-обёрток, которые вставляются в C-код, составляющий вашу систему Python, `SIGFPE` перехватывается и преобразуется в исключение Python [`FloatingPointError`](https://python-all.ru/3.0/library/fpectl.html#fpectl.FloatingPointError).2829Модуль `fpectl` определяет следующие функции и может возбуждать указанное исключение:3031#### `[fpectl.turnon_sigfpe]fpectl.turnon_sigfpe()`3233Включает генерацию3435`SIGFPE`3637и устанавливает соответствующий обработчик сигналов.3839#### `[fpectl.turnoff_sigfpe]fpectl.turnoff_sigfpe()`4041Сбрасывает обработку исключений с плавающей запятой по умолчанию.4243#### `[fpectl.FloatingPointError]exception fpectl.FloatingPointError`4445После выполнения4647[`turnon_sigfpe()`](https://python-all.ru/3.0/library/fpectl.html#fpectl.turnon_sigfpe)4849операция с плавающей запятой, которая возбуждает одно из исключений IEEE-754: Деление на ноль, Переполнение или Недопустимая операция, в свою очередь возбудит это стандартное исключение Python.5051## Пример5253Следующий пример демонстрирует, как запустить и проверить работу модуля `fpectl`.5455```python56>>> import fpectl57>>> import fpetest58>>> fpectl.turnon_sigfpe()59>>> fpetest.test()60overflow PASS61FloatingPointError: Overflow6263div by 0 PASS64FloatingPointError: Division by zero65 [ more output from test elided ]66>>> import math67>>> math.exp(1000)68Traceback (most recent call last):69 File "<stdin>", line 1, in ?70FloatingPointError: in math_171```7273## Ограничения и другие соображения7475Настройка конкретного процессора на перехват ошибок IEEE-754 с плавающей запятой в настоящее время требует индивидуального кода для каждой архитектуры. Возможно, потребуется изменить `fpectl` для управления вашим конкретным оборудованием.7677Для преобразования исключения IEEE-754 в исключение Python требуется вставить в код соответствующим образом макросы-обёртки `PyFPE_START_PROTECT` и `PyFPE_END_PROTECT`. Сам Python был изменён для поддержки модуля `fpectl`, но многие другие программы, представляющие интерес для численных аналитиков, – нет.7879Модуль `fpectl` не является потокобезопасным.8081> **См. также**82>83> Некоторые файлы в дистрибутиве исходного кода могут быть интересны для более подробного изучения того, как работает этот модуль. Заголовочный файл `Include/pyfpe.h` обсуждает реализацию этого модуля довольно подробно. `Modules/fpetestmodule.c` содержит несколько примеров использования. Много дополнительных примеров можно найти в `Objects/floatobject.c`.84