how *not* to use denormalised numbers?
Dominique d'Humières
dominiq@lps.ens.fr
Tue Nov 10 16:59:00 GMT 2015
Consider the following modification of the test
use ieee_arithmetic
logical :: gradual
write (*,*) "Support underflow control:", &
ieee_support_underflow_control()
call ieee_get_underflow_mode( gradual )
write (*,*) "Gradual underflow:", gradual
write (*,*) "Support denormals:", ieee_support_denormal()
print *, nearest(tiny(1.0d0), -1.0d0)
print *, nearest(0.0d0, 1.0d0)
! flip underflow mode
call ieee_set_underflow_mode( .not. gradual )
call ieee_get_underflow_mode( gradual )
write (*,*) "Gradual underflow:", gradual
write (*,*) "Support denormals:", ieee_support_denormal()
print *, nearest(tiny(1.0d0), -1.0d0)
print *, nearest(0.0d0, 1.0d0)
end
Compiled with gfortran -O, it outputs
Support underflow control: F
Gradual underflow: T
Support denormals: T
2.2250738585072009E-308
4.9406564584124654E-324
Gradual underflow: F
Support denormals: T
2.2250738585072009E-308
4.9406564584124654E-324
If compiled with -O -fast-math, the output is
Support underflow control: F
Gradual underflow: F
Support denormals: T
0.0000000000000000
0.0000000000000000
Gradual underflow: T
Support denormals: T
0.0000000000000000
0.0000000000000000
IIRC correctly, this is documented somewhere in GCC, but I cannot find where. Indeed -fast-math has other side-effects and cannot be suitable.
Dominique
More information about the Fortran
mailing list