2017-06-01 252 views
1

我是Fortran的新手,一般编码,所以如果我的术语不正确,我很抱歉。IEEE_UNDERFLOW_FLAG IEEE_DENORMAL Fortran 77

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

我在做这个夏天的研究,这涉及到我得到一个写于1980年左右的程序再次工作。它是用Fortran 77编写的。我拥有所有的代码以及一些关于它的文档。

以目前的形式,我收到“IEEE_UNDERFLOW_FLAG IEEE_DENORMAL”错误。我的第一个想法是,这个代码是为了在不同的环境/架构下开发的。

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

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

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

任何意见,让我走在正确的方向将不胜感激。

+0

低于正常水平的产量可能是预期的。这不代表您在选择构建过程时遇到问题。 – tim18

+0

有关切换到双精度的说明可能很重要,因为ieee754 single的属性可能并不比vax好。 – tim18

+0

Gfortran有自动替换单人的选项。如果考虑到这一点,你应该阅读文档。 – tim18

回答

3

“IEEE_UNDERFLOW_FLAG IEEE_DENORMAL is signaling”并不罕见。它是不是错误信息

其含义是在运行代码时生成denormal numbers

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

Fortran在其最新版本中要求在执行STOP语句时报告所有发出信号的浮点异常。请参阅gfortran IEEE exception inexact顺便说一句,这也意味着您的程序不会被编译为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中详细了解这些选项。你甚至可以尝试四倍的精度,但通常对于所有合理的算法来说,双精度就足够了。

+0

不是“最后”,但只有在遇到“停止”的权利?因此,如果代码正常终止,并带有“STOP” END'去掉'STOP'应该可以解决。 (?) – agentp

+0

是的,这是相关答案的结论。我在这里也应该强调一下。 –

+0

@VladimirF我不确定这是否会导致错误,在阅读了关于HARRIS系统的更多信息后,它看起来像是在48位计算机上开发的代码。另外,按照我阅读gfortran手册的方式,无法将程序编译为Fortran 77,这是否正确?感谢您的所有帮助。 – Robert