浮点异常是新gfortran版本中的信令

时间:2016-09-06 13:54:08

标签: gcc fortran gfortran gcc-warning

我目前正在调试我的老板在90年代写过的一些软件的子程序。似乎在特定子例程的do循环中发生浮点异常:

16  irad=1,incmax
    rr1=rr2
    rr2=rr2+rdiv
      if(rr1.gt.rlimit) goto 16
      if(pts(irad).gt.0.0) then
         discrm=(rmsden(mt,irad)/pts(irad))
     1          -((average(mt,irad)**2)/(pts(irad)**2))
      else
         discrm=0.0
      endif
      if(discrm.ge.0.0) then
         rmsden(mt,irad)=sqrt(discrm)
      else
         rmsden(mt,irad)=0.0
      endif

      average(mt,irad)=average(mt,irad)/pts(irad)
      average(mt,irad)=(average(mt,irad)*100.0)/bigmost(mt)
      rmsden(mt,irad)=(rmsden(mt,irad)*100.0)/bigmost(mt)
      denbot(mt,irad)=(denbot(mt,irad)*100.0)/bigmost(mt)
      dentop(mt,irad)=(dentop(mt,irad)*100.0)/bigmost(mt)
      iradmax(mt)=irad


 17   if(iverbose0.ge.1) then
         ipts=pts(irad)
         iptszero=ptszero(irad)
         if(ipts.eq.0) then
            average(mt,irad)=0.0
            rmsden(mt,irad)=0.0
            denbot(mt,irad)=0.0
            dentop(mt,irad)=0.0
         endif
         write(6,99) rr1,rr2,ipts,iptszero,average(mt,irad),
     1               rmsden(mt,irad),denbot(mt,irad),dentop(mt,irad)
 99      format(1x,2f9.2,2i8,2f8.1,2f8.1)
      endif
 16   continue
      stop 'PIPPA'

If I put the stop 'PIPPA' statement before "16  continue", the there are no errors. However, if the stop statement goes after the "16  continue", I get: 
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG
STOP PIPPA

在升级GCC编译器/库之前没有发生这种情况。我承认我通过谷歌搜索找到了很多资源,但我仍无法调试。我在编译时也尝试了--fpe-trap标志,但它们没有输出任何内容。

为什么gfortran现在抱怨?

1 个答案:

答案 0 :(得分:1)

这里似乎有两个问题。让我们试着回答每一个。

<强> 1。为什么新的GFortran版本会打印这样的消息

由于Fortran 2008标准要求执行STOP和ERROR STOP语句输出当前信令FP异常的列表(如果系统支持这样的事情),GFortran将遵循GFortran版本4.9。请参阅https://gcc.gnu.org/ml/fortran/2013-06/msg00072.html

<强> 2。为什么我的代码会触发此异常,为什么它只发生在新的GFortran版本

很可能,异常也在之前发出信号,但由于它没有在STOP语句中打印,所以你不知道它。由于您显示的示例不是自包含的(我无法编译和测试),我只建议您尝试常用的调试命令行选项,例如“-fcheck = all,-ffpe-trap = invalid,零,溢出-g -Wall -Wextra -Werror -pedantic“,检查在valgrind等下运行你的程序。