diff options
-rw-r--r-- | Doc/lib/libfpectl.tex | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Doc/lib/libfpectl.tex b/Doc/lib/libfpectl.tex new file mode 100644 index 0000000..53c3406 --- /dev/null +++ b/Doc/lib/libfpectl.tex @@ -0,0 +1,122 @@ +\section{\module{fpectl} --- + Floating point exception control} + +\declaremodule{extension}{fpectl} + \platform{Unix, Windows} +\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} |