6

有没有一种方法可以捕获整数异常,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

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

4

2 回答 2

4

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

huge(2_8)+1 < 0_8

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

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

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

于 2013-09-18T21:21:10.297 回答
1

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

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

ifort似乎没有这种能力。

于 2013-09-26T22:23:08.610 回答