gfortran中为零

bob*_*nto 5 fortran gfortran underflow

有没有办法在gfortran强制下溢到下溢?

我不敢相信这是第一次有人问这个,但我找不到任何东西.Mea culpa如果这是重复的话.

cas*_*sey 7

您可以使用支持Fortran 2003 IEEE模块的最新版本的gfortran来实现此目的.该标准定义了两种下溢模式 - 渐进和突然.Abrupt是你想要的,它将下溢设置为0并发出下溢浮点异常的信号.您可以使用针对ieee_support_underflow_control(X)实际X的类型测试下溢控制的函数来测试对下溢模式的控制的支持,并且如果支持则返回逻辑真.如果支持,则call ieee_set_underflow_mode(.false.)可以设置突然下溢模式.

下面是一个测试程序,您可以使用它来测试默认实际类型的下溢控制支持:

program test
  use, intrinsic :: ieee_arithmetic
  use, intrinsic :: iso_fortran_env, only: compiler_version, compiler_options
  implicit none
  logical :: underflow_support, gradual, underflow
  real :: fptest
  integer :: i

  print '(4a)',  'This file was compiled by ', &
       compiler_version(), ' using the options ', &
       compiler_options()
  fptest = 0.0
  underflow_support = ieee_support_underflow_control(fptest)
  if (underflow_support) then
     print *,'Underflow control supported for the default real kind'
  else
     stop 'no underflow control support'
  end if

  call ieee_set_underflow_mode(.false.)
  call ieee_get_underflow_mode(gradual)
  if (.not.gradual) then 
     print *,'Able to set abrupt underflow mode'
  else
     stop 'error setting underflow mode'
  end if

  fptest = 2e-36
  do i=1,50 ! 50 iterations max
     fptest = fptest * 0.5
     print '(e15.10)',fptest
     call ieee_get_flag(ieee_underflow,underflow)
     if (underflow) print *,'Underflow exception signaling'
     if (fptest == 0.0) exit
  end do

end program test
Run Code Online (Sandbox Code Playgroud)

使用gfortran 5.2.0版,该程序输出:

This file was compiled by GCC version 5.2.0 using the options -mtune=generic -march=x86-64 -fno-unsafe-math-optimizations -frounding-math -fsignaling-nans
 Underflow control supported for the default real kind
 Able to set abrubpt underflow mode
.1000000036E-35
.5000000180E-36
.2500000090E-36
.1250000045E-36
.6250000225E-37
.3125000112E-37
.1562500056E-37
.0000000000E+00
 Underflow exception signaling
Run Code Online (Sandbox Code Playgroud)

-fno-unsafe-math-optimizations -frounding-math -fsignaling-nansgfortran 5.2文档建议使用编译器选项标志,以便在使用IEEE模块时确保遵守标准.