Run-Time Function: Sets the floating-point exception flags. This routine can be called from a C or Fortran program.
USE IFCORE
result = FOR_SET_FPE (a)
a |
Must be of type INTEGER(4). It contains bit flags controlling floating-point exception trapping, reporting, and result handling. |
The result type is INTEGER(4). The return value represents the previous settings of the floating-point exception flags. The meanings of the bits are defined in the IFCORE module file.
To get the current settings of the floating-point exception flags, use FOR_GET_FPE.
USE IFCORE
INTEGER*4 OLD_FPE_FLAGS, NEW_FPE_FLAGS
OLD_FPE_FLAGS = FOR_SET_FPE (NEW_FPE_FLAGS)
The following example program is compiled without any fpe options; however, it uses calls to for_set_fpe to enable the same flags as when compiling with the fpe:0 option. The new flags can be verified by compiling the program with the -fpe:0 option.
program samplefpe
use ifcore
implicit none
INTEGER(4) :: ORIGINAL_FPE_FLAGS, NEW_FPE_FLAGS
INTEGER(4) :: CURRENT_FPE_FLAGS, PREVIOUS_FPE_FLAGS
NEW_FPE_FLAGS = FPE_M_TRAP_UND + FPE_M_TRAP_OVF + FPE_M_TRAP_DIV0 &
+ FPE_M_TRAP_INV + FPE_M_ABRUPT_UND + FPE_M_ABRUPT_DMZ
ORIGINAL_FPE_FLAGS = FOR_SET_FPE (NEW_FPE_FLAGS)
CURRENT_FPE_FLAGS = FOR_GET_FPE ()
print *,"The original FPE FLAGS were:"
CALL PRINT_FPE_FLAGS(ORIGINAL_FPE_FLAGS)
print *," "
print *,"The new FPE FLAGS are:"
CALL PRINT_FPE_FLAGS(CURRENT_FPE_FLAGS)
!! restore the fpe flag to their original values
PREVIOUS_FPE_FLAGS = FOR_SET_FPE (ORIGINAL_FPE_FLAGS)
end
subroutine PRINT_FPE_FLAGS(fpe_flags)
use ifcore
implicit none
integer(4) :: fpe_flags
character(3) :: toggle
print 10, fpe_flags, fpe_flags
10 format(X,'FPE FLAGS = 0X',Z8.8," B'",B32.32)
if ( IAND(fpe_flags, FPE_M_TRAP_UND) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_TRAP_UND :", toggle
if ( IAND(fpe_flags, FPE_M_TRAP_OVF) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_TRAP_OVF :", toggle
if ( IAND(fpe_flags, FPE_M_TRAP_DIV0) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_TRAP_DIV0 :", toggle
if ( IAND(fpe_flags, FPE_M_TRAP_INV) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_TRAP_INV :", toggle
if ( IAND(fpe_flags, FPE_M_ABRUPT_UND) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_ABRUPT_UND :", toggle
if ( IAND(fpe_flags, FPE_M_ABRUPT_OVF) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_ABRUPT_OVF :", toggle
if ( IAND(fpe_flags, FPE_M_ABRUPT_DMZ) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_ABRUPT_DIV0 :", toggle
if ( IAND(fpe_flags, FPE_M_ABRUPT_DIV0) .ne. 0 ) then
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_ABRUPT_INV :", toggle
if ( IAND(fpe_flags, FPE_M_ABRUPT_DMZ) .ne. 0 ) then ! ABRUPT_DMZ
toggle = "ON"
else
toggle = "OFF"
endif
write(*,*) " FPE_ABRUPT_DMZ :", toggle, " (ftz related)"
end subroutine PRINT_FPE_FLAGS
The output from this program is as follows:
>ifort set_fpe_sample01.f90
>set_fpe_sample01.exe
The original FPE FLAGS were:
FPE FLAGS = 0X00000000 B'00000000000000000000000000000000
FPE_TRAP_UND :OFF
FPE_TRAP_OVF :OFF
FPE_TRAP_DIV0 :OFF
FPE_TRAP_INV :OFF
FPE_ABRUPT_UND :OFF
FPE_ABRUPT_OVF :OFF
FPE_ABRUPT_DIV0 :OFF
FPE_ABRUPT_INV :OFF
FPE_ABRUPT_DMZ :OFF (ftz related)
The new FPE FLAGS are:
FPE FLAGS = 0X0011000F B'00000000000100010000000000001111
FPE_TRAP_UND :ON
FPE_TRAP_OVF :ON
FPE_TRAP_DIV0 :ON
FPE_TRAP_INV :ON
FPE_ABRUPT_UND :ON
FPE_ABRUPT_OVF :OFF
FPE_ABRUPT_DIV0 :ON
FPE_ABRUPT_INV :OFF
FPE_ABRUPT_DMZ :ON (ftz related)