g77_i386_fpe_demo, version 0.1

This small S/W package demonstrates handling of floating point exceptions (FPEs) under g77/i386/Linux. By default exceptions are not generated and serious errors such has sqrt(-ve number) and x/0.0 result in IEEE NaN and (+/-) INF propagating through the program.

Having learnt FORTRAN programming under another platform (DEC VMS) where serious floating point errors always generate exceptions and the program terminates, I found the default behaviour under g77/i386/Linux quite disconcerting.

There are several tips to be found on Usenet and on the gcc website, eg. http://gcc.gnu.org/onlinedocs/gcc-3.0.3/g77_20.html#SEC643 for dealing with this situation but no complete worked examples showing the creation and usage of FPE handlers under g77/i386/Linux.

This package comprises two simple FORTRAN calling programs which demonstrate handling and trapping the six types of FPEs generated by the i387 FPU in accordance with the IEEE standard, IEEE-754, namely,

(1) Invalid operation
(2) Denormalised result
(3) Division by zero
(4) Overflow
(5) Underflow
(6) Precision loss (inexact result)

Probably, the most useful default settings are to trap exceptions; 1, 3 & 4 above.

Alternatively, when running the programs under the GNU debugger gdb, gdb's own exception handlers trap the FPEs. Debugger commands such as 'list' and 'bt' can be used to locate the line/calling sequence which generated the exception.  The 'info float' command can then be used to examine the status of the FPU.

The tarball (version 0.1) is here .

This software is released under the GNU GPL.

Programmers interested in doing more sophisticated things regarding handling FPEs should investigate Bill Metzenthen's wmexcp package.

Added: 18th May 2005
It is worth adding that g95 now supports easy trapping of FPEs via environment variables. See the manual for details.  Eg. defining G95_FPU_INVALID will cause the runtime to display a message and exit when a NaN occurs.  Running under gdb will give the file/line number where the FPE occurred.

Tom Crane, May 2005
T.Crane@rhul.ac.uk