| 
									
										
										
										
											2001-01-09 20:38:54 +00:00
										 |  |  | \section{\module{fpectl} --- | 
					
						
							|  |  |  |          Floating point exception control} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \declaremodule{extension}{fpectl} | 
					
						
							| 
									
										
										
										
											2001-07-05 21:17:08 +00:00
										 |  |  |   \platform{Unix} | 
					
						
							| 
									
										
										
										
											2001-01-09 20:38:54 +00:00
										 |  |  | \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 | 
					
						
							| 
									
										
										
										
											2001-07-05 21:17:08 +00:00
										 |  |  | >>> math.exp(1000) / math.exp(1000) | 
					
						
							| 
									
										
										
										
											2001-01-09 20:38:54 +00:00
										 |  |  | 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} |