41 lines
1.1 KiB
Fortran
41 lines
1.1 KiB
Fortran
program rosetta_divbyzero
|
|
implicit none
|
|
integer, parameter :: rdp = kind(1.d0)
|
|
real(rdp) :: normal,zero
|
|
|
|
normal = 1.d0
|
|
zero = 0.d0
|
|
|
|
call div_by_zero_check(normal,zero)
|
|
|
|
contains
|
|
|
|
subroutine div_by_zero_check(x,y)
|
|
use, intrinsic :: ieee_exceptions
|
|
use, intrinsic :: ieee_arithmetic
|
|
implicit none
|
|
real(rdp), intent(in) :: x,y
|
|
|
|
real(rdp) :: check
|
|
type(ieee_status_type) :: status_value
|
|
logical :: flag
|
|
flag = .false.
|
|
! Get the flags
|
|
call ieee_get_status(status_value)
|
|
! Set the flags quiet
|
|
call ieee_set_flag(ieee_divide_by_zero,.false.)
|
|
write(*,*)"Inf supported? ",ieee_support_inf(check)
|
|
|
|
! Calculation involving exception handling
|
|
check = x/y
|
|
write(*,*)"Is check finite?",ieee_is_finite(check), check
|
|
|
|
call ieee_get_flag(ieee_divide_by_zero, flag)
|
|
if (flag) write(*,*)"Warning! Division by zero detected"
|
|
|
|
! Restore the flags
|
|
call ieee_set_status(status_value)
|
|
|
|
end subroutine div_by_zero_check
|
|
|
|
end program rosetta_divbyzero
|