fortran - Fortran 77 中的 IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

标签 fortran gfortran fortran77

我对 Fortran 和一般编码都很陌生,所以如果我的术语不正确,我深表歉意。

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

今年夏天我正在做研究,其中涉及让 1980 年左右编写的程序再次运行。它是用 Fortran 77 编写的。我有所有代码以及一些相关文档。

在当前形式中,我收到“IEEE_UNDERFLOW_FLAG IEEE_DENORMAL”错误。我的第一个想法是这段代码应该在不同的环境/架构下开发。

文档指出“该程序设计为在 HARRIS 计算机系统上运行。如果将主代码和子程序包中的单精度变量改为 double 变量,也可以在VAX系统上运行。”

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

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

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

最佳答案

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

意思是有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,它就没有用,甚至没有危害。

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

关于fortran - Fortran 77 中的 IEEE_UNDERFLOW_FLAG IEEE_DENORMAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44308577/

相关文章:

Fortran 'call' 语句 : what can it actually call?

arrays - 如何检查 Fortran 数组是否包含值?

linux - 解释 gfortran 错误回溯

gcc - gfortran : error: -fuse-linker-plugin is not supported in the compilation

c++ - 将 Fortran 77 程序与 C++ dll 链接

Fortran 使用内部 goto 执行循环

fortran - 直接链接 fortran 代码中的库,无需编译器标志

fortran - 象征性的.and.和.or. Fortran 中的表达式?

windows-7 - "Relocation truncated to fit"仅适用于 -static

c++ - 如何从主应用程序解析库的编译器特定运行时初始化函数