fpectl.md
1> **Источник:** https://python-all.ru/2.7/library/fpectl.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 28.16. [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl) – Управление исключениями с плавающей точкой89> **Примечание**10>11> Модуль [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl) не собирается по умолчанию, его использование не рекомендуется и может быть опасным, если им не пользуются эксперты. См. также раздел [Ограничения и прочие соображения](https://python-all.ru/2.7/library/fpectl.html#fpectl-limitations) для получения более подробной информации об ограничениях.1213Большинство компьютеров выполняют операции с плавающей запятой в соответствии с так называемым стандартом IEEE-754. На любом реальном компьютере некоторые операции с плавающей запятой дают результаты, которые невозможно выразить в виде обычного числа с плавающей запятой. Например, попробуйте1415```python16>>> import math17>>> math.exp(1000)18inf19>>> math.exp(1000) / math.exp(1000)20nan21```2223(Приведённый выше пример будет работать на многих платформах. DEC Alpha может быть исключением.) «Inf» – это специальное нечисловое значение в IEEE-754, обозначающее «бесконечность», а «nan» означает «не число». Обратите внимание, что, помимо нечисловых результатов, ничего особенного не произошло, когда вы попросили Python выполнить эти вычисления. На самом деле это поведение по умолчанию, предписанное стандартом IEEE-754, и если оно вас устраивает, прекратите чтение сейчас.2425В некоторых обстоятельствах было бы лучше вызвать исключение и остановить обработку в точке, где была предпринята ошибочная операция. Модуль [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl) предназначен для использования в такой ситуации. Он обеспечивает управление блоками с плавающей точкой от нескольких производителей оборудования, позволяя пользователю включить генерацию `SIGFPE` всякий раз, когда происходит одно из исключений IEEE-754: деление на ноль, переполнение или недопустимая операция. Вместе с парой макросов-обёрток, которые вставляются в код C, составляющий вашу систему Python, `SIGFPE` перехватывается и преобразуется в исключение Python [`FloatingPointError`](https://python-all.ru/2.7/library/fpectl.html#fpectl.FloatingPointError).2627Модуль [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl) определяет следующие функции и может возбуждать данное исключение:2829#### `fpectl.turnon_sigfpe()`3031Включает генерацию `SIGFPE` и устанавливает соответствующий обработчик сигнала.3233#### `fpectl.turnoff_sigfpe()`3435Сбрасывает обработку исключений с плавающей запятой по умолчанию.3637#### `exception fpectl.FloatingPointError`3839После выполнения [`turnon_sigfpe()`](https://python-all.ru/2.7/library/fpectl.html#fpectl.turnon_sigfpe) операция с плавающей точкой, которая возбуждает одно из исключений IEEE-754 (деление на ноль, переполнение или недопустимая операция), в свою очередь возбудит это стандартное исключение Python.4041## 28.16.1. Пример4243Следующий пример демонстрирует, как запустить и проверить работу модуля [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl).4445```python46>>> import fpectl47>>> import fpetest48>>> fpectl.turnon_sigfpe()49>>> fpetest.test()50overflow PASS51FloatingPointError: Overflow5253div by 0 PASS54FloatingPointError: Division by zero55 [ more output from test elided ]56>>> import math57>>> math.exp(1000)58Traceback (most recent call last):59 File "<stdin>", line 1, in <module>60FloatingPointError: in math_161```6263## 28.16.2. Ограничения и прочие соображения6465Настройка данного процессора для перехвата ошибок с плавающей точкой по стандарту IEEE-754 в настоящее время требует собственного кода для каждой архитектуры. Возможно, вам придётся изменить [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl), чтобы управлять конкретным оборудованием.6667Для преобразования исключения IEEE-754 в исключение Python необходимо, чтобы макросы-обёртки `PyFPE_START_PROTECT` и `PyFPE_END_PROTECT` были вставлены в ваш код подходящим образом. Python сам был изменён для поддержки модуля [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl), но многие другие коды, представляющие интерес для численных аналитиков, не были.6869Модуль [`fpectl`](https://python-all.ru/2.7/library/fpectl.html#module-fpectl) не является потокобезопасным.7071> **См. также**72>73> Некоторые файлы в дистрибутиве исходного кода могут быть интересны для более глубокого изучения работы этого модуля. Включаемый файл [Include/pyfpe.h](https://python-all.ru/src/2.7/Include/pyfpe.h) обсуждает реализацию этого модуля достаточно подробно. [Modules/fpetestmodule.c](https://python-all.ru/src/2.7/Modules/fpetestmodule.c) содержит несколько примеров использования. Множество дополнительных примеров можно найти в [Objects/floatobject.c](https://python-all.ru/src/2.7/Objects/floatobject.c).74