Spec-Zone.ru › Python 2.7

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API