Fortran 77中的IEEE_UNDERFLOW_FLAG和IEEE_DENORMAL是什么?

11

我刚接触Fortran和编程,如果术语不正确请见谅。

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

今年夏天我的研究涉及到使约1980年编写的程序重新运行。它是用Fortran 77编写的。我拥有所有代码以及一些文档。

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

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

我已经尝试将单精度变量更改为双精度变量,但可能做错了。如果这是正确的做法,任何见解都将非常感激。

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

任何指导都将非常感激。


生成次标准数可能是可以预料到的。这并不表示您选择的构建程序存在问题。 - tim18
切换到双精度的指令可能很重要,因为 ieee754 单精度的属性可能不如 vax。 - tim18
Gfortran有自动将单精度替换为双精度的选项。如果考虑使用此功能,您应该阅读文档。 - tim18
1个回答

18

"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL是一种信号,这并不罕见。它不是错误信息

这意味着在运行代码时生成了非规格化数

这可能是关于您代码中的数值问题的提示,但本质上它不是一个错误。很可能意味着您的程序已经成功完成。

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手册中阅读有关这些选项的更多信息。您甚至可以尝试四倍精度,但对于所有合理的算法,双倍精度通常足够。


只有在遇到 STOP 时才会停止,对吗?因此,如果代码正常终止并带有 STOP; END,则删除 STOP 应该可以解决问题。 (?) - agentp
是的,这就是链接答案的结论。我也应该在这里强调一下。 - Vladimir F Героям слава
@VladimirF 我不确定这是否会导致错误,在阅读更多关于HARRIS系统的内容后,看起来代码是在48位计算机上开发的。此外,根据我所读的gfortran手册,似乎无法将我的程序编译为Fortran 77,这是正确的吗?感谢迄今为止提供的所有帮助。 - Robert
“EEE_UNDERFLOW_FLAG IEEE_DENORMAL” 之前是否标明了警告或错误?就您的项目而言,您需要一种验证代码是否按预期运行以及其正确性的方法,而这是一个更难的问题。您可能希望有一种策略来逐个子程序或函数地解决这个问题。 - Holmz
@Robert 我再次强调,这个信息不是错误信息,只是提供给你的一条信息。你可以自行决定如何处理这样的信息。你是正确的,你不能使用gfortran或任何其他现代Fortran编译器将你的代码编译为Fortran 77。Fortran 77已经过时了,而且更近期的标准修订版大多数都向后兼容。(五年后,这主要是为其他读者澄清。) - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接