Spec-Zone.ru › Python 3.6

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.

29.14.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

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

Spec-Zone.ru

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