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