Numerical Stability
Bounded Divide
Guarding Small Denominators
A defensive numeric calculation can replace a tiny denominator before division.
Program
Play the program to choose a denominator and see whether the guard is used.
bounded_divide.f90
program bounded_divide_demo
implicit none
real :: numerator
real :: raw_denominator
real :: denominator
real :: quotient
integer :: used_floor
numerator = 12.0
raw_denominator =
denominator = raw_denominator
used_floor = 0
if (abs(denominator) < 1.0) then
denominator = 1.0
used_floor = 1
end if
quotient = numerator / denominator
print '(F0.1, 1X, I0, 1X, F0.1)', raw_denominator, used_floor, quotient
end program bounded_divide_demo
program bounded_divide_demo
implicit none
real :: numerator
real :: raw_denominator
real :: denominator
real :: quotient
integer :: used_floor
numerator = 12.0
raw_denominator =
denominator = raw_denominator
used_floor = 0
if (abs(denominator) < 1.0) then
denominator = 1.0
used_floor = 1
end if
quotient = numerator / denominator
print '(F0.1, 1X, I0, 1X, F0.1)', raw_denominator, used_floor, quotient
end program bounded_divide_demo
program bounded_divide_demo
implicit none
real :: numerator
real :: raw_denominator
real :: denominator
real :: quotient
integer :: used_floor
numerator = 12.0
raw_denominator =
denominator = raw_denominator
used_floor = 0
if (abs(denominator) < 1.0) then
denominator = 1.0
used_floor = 1
end if
quotient = numerator / denominator
print '(F0.1, 1X, I0, 1X, F0.1)', raw_denominator, used_floor, quotient
end program bounded_divide_demo
guard
`abs(denominator) < 1.0` detects a risky denominator.
floor
The denominator is replaced with `1.0` only when the guard fires.
audit flag
`used_floor` records whether the stabilized path was used.