我是新的Fortran和编码在一般情况下,所以我道歉,如果我的术语不正确。
我使用的是带有gfortran编译器的Linux机器。
今年夏天,我正在做研究,这涉及到我在1980年前后写的一个程序,重新开始工作。它是用Fortran 77写的。我有所有的代码和一些关于它的文档。
以它当前的形式,我收到了一个"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL“错误。我的第一个想法是,这段代码是在不同的环境/架构下开发的。
文件中说:“这个程序是为了在HARRIS计算机系统上运行而设计的。如果将单精度变量转换为主代码和子程序包中的双精度变量,也可以在VAX系统上运行。“
我尝试过将单精度变量改为双精度变量,但我可能做错了。如果这是正确的事情做任何洞察力将是伟大的。
我也尝试过用-std=legacy和-m32编译代码。我也收到了同样的错误。
任何能让我走上正确方向的建议都将不胜感激。
发布于 2017-06-01 14:05:04
"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL is signalling“并不少见。这是,而不是错误消息。
这意味着在运行代码时会生成非正态数。
这可能是关于代码中的数值问题的提示,但它本身并不是一个错误。这可能意味着你的程序成功地完成了。
Fortran在其最新版本中要求在执行STOP
语句时报告所有正在发出信号的浮点异常。请参阅gfortran IEEE异常不精确 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手册中阅读更多关于这些选项的信息。您甚至可以尝试四倍的精度,但双倍通常应该足够所有合理的算法。
https://stackoverflow.com/questions/44308577
复制相似问题