在 Fortran 中捕获整数异常

Ale*_*ogt 5 fortran integer-overflow gfortran intel-fortran

有没有办法捕获整数异常,gfortran或者ifort像捕获浮点异常一样?

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

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
Run Code Online (Sandbox Code Playgroud)

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

Hig*_*ark 4

Fortran 标准中没有任何内容处理整数溢出。按照目前的情况,当计算超过所选类型可表示的最大值时,您甚至不能依赖整数回绕。所以,虽然像这样的测试

huge(2_8)+1 < 0_8
Run Code Online (Sandbox Code Playgroud)

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

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

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