【问题标题】:gfortran IEEE exception inexactgfortran IEEE 异常不准确
【发布时间】:2016-03-14 16:31:31
【问题描述】:

我们在一台新的 64 b 机器上使用 gfortran (5.3.1)、Fedora 23。使用简单的 gfortran -o 进行编译(我们没有使用 -ffpe-trap 选项!),会引发“classical-trivial”警告:

Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG 

这是由于 INEXACT 异常(类型 2.0/3.0)。 DDD 调试器指向一个实常数 (180d0/pi; pi = 3.141518...)。我们不明白为什么会出现这个标志,用这个基本的编译,因为这些异常一直都在发生......

这里有一些代码:

    Implicit none !real*8(a-h,o-z)   
    real*8 pi,dpi,radgra,TSI,TOL,xlsol,fi,W      
    Integer year, T1, k,m

      open(10,file='stof-elem.sol') 

          pi = 4.d0 * datan(1.d0)
         dpi = 2.d0 * pi
       radgra = 360.d0 / dpi !!!!!!!! HERE POINTS THE EXCEPTION!!!!!!!!!!

         T1 = -9998 !800d0 !1450d0 !

        TSI = 1360.d0 !1364.5d0 !1367d0 

        TOL = 0.7d0 / radgra ! dont' use smaller 

C...Name of the output file
      open(12,file='midmonth-2000.sal')

C-----------------------------------------------------------------------
            k = 0 ! outputs counter

            write(12,*)T1            

      DO m = 1, 12  ! select month
           IF(T1.lt.0) then
             xlsol = (270.d0 - dble(m-1) * 30.d0) / radgra !from Dec
               if(xlsol.lt.0d0) xlsol = xlsol + dpi
           ELSE
              xlsol = dble(m-3) * 30.d0 / radgra !from Jan
               if(xlsol.lt.0d0) xlsol = xlsol + dpi
           ENDIF 

            CALL MEANINSOLA(pi,dpi,radgra,TOL,T1,TSI,xlsol,fi,k,W)

            rewind(10) ! better rewind...
      ENDDO

       write(*,*) 'Outputs:', k,'lines'

异常出现在 RADGRA ... 的定义中,如图所示。如果重新定义常量(即,RADGRA = 57.2d0),异常会迁移到使用 RADGRA 的其他部分……以此类推……

【问题讨论】:

  • 显示至少导致打印此注释的命令。您还应该显示一些代码示例stackoverflow.com/help/mcve
  • 请按照我的要求显示完整编译命令。你在end 之前使用stop 吗?如果是,请不要这样做。报告您的 gfortran 版本和完整代码,包括 end program

标签: exception floating-point fortran gfortran


【解决方案1】:

根据https://gcc.gnu.org/ml/fortran/2013-06/msg00072.html,Fortran 标准要求在执行STOP 语句后打印这些注释。

"如果有任何异常 (14) 在该图像上发出信号,处理器应 发出警告,指示哪些异常正在发出信号;这 警告应在由命名常量 ERROR 标识的单元上 单位 (13.8.2.8)。”

请注意,即使您通过 -std=f95 请求 Fortran 95 标准,该注释仍会显示。

您可以通过-ffpe-summary= 控制此行为,请咨询您的编译器manual。默认情况下,会显示除“不准确”之外的所有异常的摘要。您是否在某处启用了不精确自己?

为什么异常信号是另一回事,你必须检查你的代码是否是你应该担心的事情。也许你不应该,不精确的浮点运算非常普遍

因为消息是由STOP 语句调用的,所以摆脱这些消息的一个简单方法是不要通过STOP 语句终止您的程序,而是让它到达END PROGRAM

【讨论】:

  • 感谢 Vladimir F. 输出正常...并且相同的定义和代码部分用于正常编译和激发的其他代码中...所以;另一个代码部分有问题吗?
  • 请按照我的要求显示完整编译命令。该注释可能是您应该担心的,信号不准确很常见,实际上非常常见
  • 正如我所说,使用 gfortran 5.3.1。通过简单的编译:gfortran -o mp.e mp.for。顺便说一句,是标准的 F77.... 是的,它有 STOP,在 END 之前
  • 删除停止 -> 警告消失。在结束前停下来我们没用。代码是F77,但编译器编译为F2008。您可以尝试更改为 -std=f95,如果它改变了某些东西(可能不会)。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2022-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多