我对 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/