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/2.7/library/fpectl.html