Fortran 77中的IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

Rob*_*ert 4 fortran gfortran fortran77

我是Fortran的新手并且编码一般,所以如果我的术语不正确,我会道歉.

我正在使用带有gfortran编译器的Linux机器.

我今年夏天正在做研究,这让我在1980年左右开始编写一个程序.它是用Fortran 77编写的.我有所有代码以及有关它的一些文档.

在其当前形式中,我收到"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL"错误.我的第一个想法是这个代码是在不同的环境/架构下开发的.

文档说明"该程序旨在在HARRIS计算机系统上运行.如果在主代码和子程序包中将单个精度变量更改为双精度变量,它也可以在VAX系统上运行.

我已经尝试将单个精度变量更改为双精度变量,但我可能做错了.如果这是正确的事情,任何见解都会很棒.

我也尝试使用-std = legacy和-m32编译编码.我也收到同样的错误.

任何建议让我朝着正确的方向前进将不胜感激.

Vla*_*r F 7

"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL正在发出信号"并不常见.这不是错误消息.

意思是运行代码时会生成规范数字.

它可能暗示了代码中的数值问题,但它本身并不是错误.可能这意味着您的程序已成功完成.

Fortran的最新版本要求在STOP执行语句时报告所有正在发出信号的浮点异常.请参阅gfortran IEEE异常不精确 BTW,这也意味着您的程序不是作为Fortran 77编译而是作为Fortran 2003或更高版本编译.

请注意,即使您通过-std=f95注释请求Fortran 95标准仍然显示,但它可以由-ffpe-summary=list标志控制.

链接的答案还说,避免这些警告的方法是不通过STOP声明完成程序,而是通过运行直到END PROGRAM.如果你有类似的东西

STOP
END
Run Code Online (Sandbox Code Playgroud)

要么

STOP
END PROGRAM
Run Code Online (Sandbox Code Playgroud)

在你的代码中,只需删除它STOP,它是无用的,如果不是甚至有害的.

你可以但是你不必通过使用双精度来成功摆脱它.如果算法中存在数值问题,即使使用双精度数也会存在.但它们可能变得不那么明显了.或者他们可能不会,这取决于.您不必重新编写的代码,只需使用-fdefault-real-8-freal-4-real-8或相似.在gfortran手册中阅读有关这些选项的更多信息.您甚至可以尝试四倍精度,但对于所有合理的算法,双倍通常应该足够.