Fortran 77中的IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

时间:2017-06-01 13:14:35

标签: fortran gfortran fortran77

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

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

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

在目前的形式中,我收到了一个" IEEE_UNDERFLOW_FLAG IEEE_DENORMAL"错误。我首先想到的是,这段代码是为了在不同的环境/架构下开发的。

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

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

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

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

1 个答案:

答案 0 :(得分:5)

" IEEE_UNDERFLOW_FLAG IEEE_DENORMAL正在发出信号"并不罕见。它是不是错误消息

意思是运行代码时会生成denormal numbers

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

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

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

链接的答案还说,避免这些警告的一种方法是不通过STOP语句完成程序,而是运行到END PROGRAM。如果您有类似

的内容
STOP
END

STOP
END PROGRAM

在您的代码中,只需删除STOP,即使不是有害的也无用。

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