我们在新的64 b机器中使用gfortran(5.3.1),Fedora 23。使用简单的gfortran -o进行编译(我们不使用-ffpe-trap选项!),激发了“经典 - 平凡”警告:
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'
EXCEPTION出现在RADGRA的定义中......如图所示。如果重新定义常量(即,RADGRA = 57.2d0),异常将使用RADGRA迁移到另一个部分...依此类推......
答案 0 :(得分:3)
根据https://gcc.gnu.org/ml/fortran/2013-06/msg00072.html,Fortran标准要求在执行STOP
语句后打印这些注释。
"如果在该图像上发出任何异常(14)信号,则处理器应该 发出警告,指出哪些例外情况发出信号;这个 警告应在由指定的常数ERROR标识的单元上 UNIT(13.8.2.8)。"
请注意,即使您按-std=f95
请求Fortran 95标准,仍会显示备注。
您可以-ffpe-summary=
控制此行为,请咨询编译器manual。默认情况下,会显示除“不精确”之外的所有异常的摘要。你有没有在某个地方做不准确?
为什么异常信令是另一回事,你必须检查你的代码是否是你应该担心的事情。可能你不应该,不精确的浮点运算非常常见。
由于STOP
语句调用了该消息,因此摆脱这些消息的一种简单方法是不通过STOP
语句终止您的程序,而是让它到达END PROGRAM
}。