【问题标题】:Catch integer exceptions in Fortran在 Fortran 中捕获整数异常
【发布时间】:2013-09-18 20:34:40
【问题描述】:

有没有办法用gfortranifort 来捕捉整数异常,就像捕捉浮点异常一样?

考虑这个简单的程序来计算阶乘:

program factorial
  use, intrinsic :: iso_fortran_env 

  implicit none
  integer(8)          :: fac
  real(REAL64)        :: facR
  integer,parameter   :: maxOrder = 30
  integer             :: i

  fac = 1 ; facR = 1.e0_REAL64
  do i=2,maxOrder
    fac=fac*i ; facR=facR*real(i,REAL64)
    write(*,*) i, fac, facR
  enddo ! i

end program

在某些时候会有溢出 - 对于integer(8),如图所示,它将在 21 点左右发生。但如果没有使用浮点数作为参考的计算,我无法确定...

【问题讨论】:

    标签: fortran gfortran integer-overflow intel-fortran


    【解决方案1】:

    Fortran 标准中没有处理整数溢出的内容。就目前而言,当计算超过所选种类中可表示的最大值时,您甚至不能依赖整数环绕。所以,虽然像

    这样的测试
    huge(2_8)+1 < 0_8
    

    可能适用于大多数当前的编译器(至少是我最近使用的那些),但不能保证。

    我确信英特尔 Fortran 和 gfortran 都不提供编译器生成的整数溢出运行时检查。我不确定其他编译器,但我会(高兴地)惊讶地发现它们中的任何一个都这样做。

    因此,我认为您必须继续当前的方法。

    【讨论】:

      【解决方案2】:

      gfortran 将使用 -ftrapv 标志捕获整数溢出,请参阅 man gcc:

      -ftrapv 此选项为加法、减法、乘法运算的有符号溢出生成陷阱。

      ifort 似乎没有这种能力。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2017-05-10
      相关资源
      最近更新 更多