fpectl — Управление исключениями при работе с плавающей точкой
Примечание
Модуль fpectl не компилируется по умолчанию, его использование не рекомендуется и может быть опасным, за исключением случаев, когда им пользуются эксперты. Дополнительную информацию о ограничениях см. в разделе Ограничения и другие соображения.
Большинство компьютеров выполняют операции с плавающей точкой в соответствии со стандартом IEEE-754. На любом реальном компьютере некоторые операции с плавающей точкой дают результаты, которые нельзя выразить как обычное значение с плавающей точкой. Например, попробуйте
>>> import math >>> math.exp(1000) inf >>> math.exp(1000) / math.exp(1000) nan
(Приведённый выше пример будет работать на многих платформах. DEC Alpha может быть исключением.) «Inf» — специальное нечисловое значение в IEEE-754, означающее «бесконечность», а «nan» означает «не число». Обратите внимание, что, помимо нечисловых результатов, ничего особенного не происходит, когда вы просите Python выполнить эти вычисления. Это, фактически, стандартное поведение, предписанное стандартом IEEE-754, и если оно работает для вас, прекратите чтение.
В некоторых ситуациях было бы лучше выдать исключение и остановить обработку в точке, где была предпринята ошибочная операция. Модуль fpectl предназначен для использования в такой ситуации. Он обеспечивает контроль над модулями обработки операций с плавающей точкой от нескольких производителей оборудования, позволяя пользователю включить генерацию SIGFPE всякий раз, когда происходит любое из исключений IEEE-754: деление на ноль, переполнение или некорректная операция. В сочетании с парой обертывающих макросов, которые вставляются в код C вашего Python-системы, SIGFPE отлавливается и преобразуется в исключение Python FloatingPointError.
Модуль fpectl определяет следующие функции и может вызывать указанное исключение:
-
fpectl.turnon_sigfpe() -
Включить генерацию
SIGFPE, и установить соответствующий обработчик сигналов.
-
fpectl.turnoff_sigfpe() -
Сбросить обработку исключений при работе с плавающей точкой по умолчанию.
-
exception fpectl.FloatingPointError -
После выполнения
turnon_sigfpe(), операция с плавающей точкой, вызывающая одно из исключений IEEE-754 — деление на ноль, переполнение или некорректная операция — в свою очередь вызовет это стандартное исключение Python.
1. Пример
Следующий пример демонстрирует, как запустить и протестировать работу модуля fpectl.
>>> import fpectl >>> import fpetest >>> fpectl.turnon_sigfpe() >>> fpetest.test() overflow PASS FloatingPointError: Overflow div by 0 PASS FloatingPointError: Division by zero [ more output from test elided ] >>> import math >>> math.exp(1000) Traceback (most recent call last): File "<stdin>", line 1, in <module> FloatingPointError: in math_1
2. Ограничения и другие соображения
Настройка данного процессора для отслеживания ошибок с плавающей точкой IEEE-754 в настоящее время требует пользовательского кода для каждой архитектуры. Возможно, потребуется изменить fpectl для управления вашим конкретным оборудованием.
Преобразование исключения IEEE-754 в исключение Python требует, чтобы обертывающие макросы PyFPE_START_PROTECT и PyFPE_END_PROTECT были вставлены в ваш код соответствующим образом. Сам Python был изменен для поддержки модуля fpectl, но многие другие коды, представляющие интерес для численных аналитиков, не были.
Модуль fpectl не является потокобезопасным.
См. также
Некоторые файлы в дистрибутиве исходного кода могут быть интересны для более подробного изучения работы этого модуля. Файл заголовков Include/pyfpe.h подробно рассматривает реализацию этого модуля. Modules/fpetestmodule.c предоставляет несколько примеров использования. Многие дополнительные примеры можно найти в Objects/floatobject.c.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/fpectl.html