| \section{\module{fpectl} --- |
| Floating point exception control} |
| |
| \declaremodule{extension}{fpectl} |
| \platform{Unix} |
| \moduleauthor{Lee Busby}{busby1@llnl.gov} |
| \sectionauthor{Lee Busby}{busby1@llnl.gov} |
| \modulesynopsis{Provide control for floating point exception handling.} |
| |
| Most computers carry out floating point operations\index{IEEE-754} |
| in conformance with the so-called IEEE-754 standard. |
| On any real computer, |
| some floating point operations produce results that cannot |
| be expressed as a normal floating point value. |
| For example, try |
| |
| \begin{verbatim} |
| >>> import math |
| >>> math.exp(1000) |
| inf |
| >>> math.exp(1000) / math.exp(1000) |
| nan |
| \end{verbatim} |
| |
| (The example above will work on many platforms. |
| DEC Alpha may be one exception.) |
| "Inf" is a special, non-numeric value in IEEE-754 that |
| stands for "infinity", and "nan" means "not a number." |
| Note that, |
| other than the non-numeric results, |
| nothing special happened when you asked Python |
| to carry out those calculations. |
| That is in fact the default behaviour prescribed in the IEEE-754 standard, |
| and if it works for you, |
| stop reading now. |
| |
| In some circumstances, |
| it would be better to raise an exception and stop processing |
| at the point where the faulty operation was attempted. |
| The \module{fpectl} module |
| is for use in that situation. |
| It provides control over floating point |
| units from several hardware manufacturers, |
| allowing the user to turn on the generation |
| of \constant{SIGFPE} whenever any of the |
| IEEE-754 exceptions Division by Zero, Overflow, or |
| Invalid Operation occurs. |
| In tandem with a pair of wrapper macros that are inserted |
| into the C code comprising your python system, |
| \constant{SIGFPE} is trapped and converted into the Python |
| \exception{FloatingPointError} exception. |
| |
| The \module{fpectl} module defines the following functions and |
| may raise the given exception: |
| |
| \begin{funcdesc}{turnon_sigfpe}{} |
| Turn on the generation of \constant{SIGFPE}, |
| and set up an appropriate signal handler. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{turnoff_sigfpe}{} |
| Reset default handling of floating point exceptions. |
| \end{funcdesc} |
| |
| \begin{excdesc}{FloatingPointError} |
| After \function{turnon_sigfpe()} has been executed, |
| a floating point operation that raises one of the |
| IEEE-754 exceptions |
| Division by Zero, Overflow, or Invalid operation |
| will in turn raise this standard Python exception. |
| \end{excdesc} |
| |
| |
| \subsection{Example \label{fpectl-example}} |
| |
| The following example demonstrates how to start up and test operation of |
| the \module{fpectl} module. |
| |
| \begin{verbatim} |
| >>> 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 ? |
| FloatingPointError: in math_1 |
| \end{verbatim} |
| |
| |
| \subsection{Limitations and other considerations} |
| |
| Setting up a given processor to trap IEEE-754 floating point |
| errors currently requires custom code on a per-architecture basis. |
| You may have to modify \module{fpectl} to control your particular hardware. |
| |
| Conversion of an IEEE-754 exception to a Python exception requires |
| that the wrapper macros \code{PyFPE_START_PROTECT} and |
| \code{PyFPE_END_PROTECT} be inserted into your code in an appropriate |
| fashion. Python itself has been modified to support the |
| \module{fpectl} module, but many other codes of interest to numerical |
| analysts have not. |
| |
| The \module{fpectl} module is not thread-safe. |
| |
| \begin{seealso} |
| \seetext{Some files in the source distribution may be interesting in |
| learning more about how this module operates. |
| The include file \file{Include/pyfpe.h} discusses the |
| implementation of this module at some length. |
| \file{Modules/fpetestmodule.c} gives several examples of |
| use. |
| Many additional examples can be found in |
| \file{Objects/floatobject.c}.} |
| \end{seealso} |