Exception gfortran IEEE异常不精确

Exception gfortran IEEE异常不精确,exception,floating-point,fortran,gfortran,Exception,Floating Point,Fortran,Gfortran,我们在新的64B机器中使用gfortran(5.3.1)、Fedora23。使用简单的gfortran-o编译(我们不使用-ffpe陷阱选项!)会引发“经典-平凡”警告: Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG 其原因是不精确异常(类型2.0/3.0)。DDD调试器指向一个实常量(180d0/pi;pi=3.141518…)。我们不明白为什么在这个基本编译中会出现这个标志,

我们在新的64B机器中使用gfortran(5.3.1)、Fedora23。使用简单的gfortran-o编译(我们不使用-ffpe陷阱选项!)会引发“经典-平凡”警告:

Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG 
其原因是不精确异常(类型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。。。等等

根据Fortran标准,执行
STOP
语句后需要打印这些注释

“如果任何异常(14)在该图像上发出信号,处理器应 发出警告,指示哪些异常正在发出信号;此 警告应出现在由命名恒定误差标识的装置上 单元(13.8.2.8)。”

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

您可以通过
-ffpe summary=
来控制此行为,请咨询您的编译器。默认情况下,将显示除“不精确”之外的所有异常的摘要。你在什么地方使自己变得不精确了吗

为什么异常信号是另一回事,您必须检查您的代码,看它是否是您应该担心的事情。可能您不应该这样做,不精确的浮点运算非常常见


由于消息是由
STOP
语句调用的,因此消除这些消息的一个简单方法是不要通过
STOP
语句终止程序,而是让它到达
END program

至少显示导致打印此便笺的命令。您还应该显示一些代码示例,请按照我的要求显示完整的编译命令。您是否在
结束之前使用
停止
?如果是,不要这样做。报告您的gfortran版本和完整代码,包括
结束程序
。谢谢Vladimir F。输出正常。。。同样的定义和代码部分也用于其他具有正常编译和激励的代码中。。。所以另一个代码部分出现问题?请按照我的要求显示完整的编译命令。注释可能是你不应该担心的,不精确的信号很常见,事实上非常常见。正如我所说,使用gfortran 5.3.1。通过简单的编译:gfortran-omp.emp.for。顺便问一下,是标准F77吗。。。。是的,它已经停止,在结束之前删除停止->警告消失。在比赛结束前停下来是没有用的。代码是F77,但编译器将其编译为F2008。您可以尝试更改为-std=f95,如果它更改了某些内容(可能没有)。