| :mod:`fpectl` --- Floating point exception control | 
 | ================================================== | 
 |  | 
 | .. module:: fpectl | 
 |    :platform: Unix | 
 |    :synopsis: Provide control for floating point exception handling. | 
 |  | 
 | .. moduleauthor:: Lee Busby <busby1@llnl.gov> | 
 | .. sectionauthor:: Lee Busby <busby1@llnl.gov> | 
 |  | 
 | .. note:: | 
 |  | 
 |    The :mod:`fpectl` module is not built by default, and its usage is discouraged | 
 |    and may be dangerous except in the hands of experts.  See also the section | 
 |    :ref:`fpectl-limitations` on limitations for more details. | 
 |  | 
 | .. index:: single: IEEE-754 | 
 |  | 
 | -------------- | 
 |  | 
 | Most computers carry out floating point operations 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 :: | 
 |  | 
 |    >>> import math | 
 |    >>> math.exp(1000) | 
 |    inf | 
 |    >>> math.exp(1000) / math.exp(1000) | 
 |    nan | 
 |  | 
 | (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 | 
 | :mod:`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 :const:`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, :const:`SIGFPE` is trapped and converted into the Python | 
 | :exc:`FloatingPointError` exception. | 
 |  | 
 | The :mod:`fpectl` module defines the following functions and may raise the given | 
 | exception: | 
 |  | 
 |  | 
 | .. function:: turnon_sigfpe() | 
 |  | 
 |    Turn on the generation of :const:`SIGFPE`, and set up an appropriate signal | 
 |    handler. | 
 |  | 
 |  | 
 | .. function:: turnoff_sigfpe() | 
 |  | 
 |    Reset default handling of floating point exceptions. | 
 |  | 
 |  | 
 | .. exception:: FloatingPointError | 
 |  | 
 |    After :func:`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. | 
 |  | 
 |  | 
 | .. _fpectl-example: | 
 |  | 
 | Example | 
 | ------- | 
 |  | 
 | The following example demonstrates how to start up and test operation of the | 
 | :mod:`fpectl` module. :: | 
 |  | 
 |    >>> 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 | 
 |  | 
 |  | 
 | .. _fpectl-limitations: | 
 |  | 
 | 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 | 
 | :mod:`fpectl` to control your particular hardware. | 
 |  | 
 | Conversion of an IEEE-754 exception to a Python exception requires that the | 
 | wrapper macros ``PyFPE_START_PROTECT`` and ``PyFPE_END_PROTECT`` be inserted | 
 | into your code in an appropriate fashion.  Python itself has been modified to | 
 | support the :mod:`fpectl` module, but many other codes of interest to numerical | 
 | analysts have not. | 
 |  | 
 | The :mod:`fpectl` module is not thread-safe. | 
 |  | 
 |  | 
 | .. seealso:: | 
 |  | 
 |    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`. | 
 |  |