浮点错误 gfortran

Posted

技术标签:

【中文标题】浮点错误 gfortran【英文标题】:floating point error gfortran 【发布时间】:2015-04-03 13:52:59 【问题描述】:

我正在尝试调试 Fortran 程序。为了捕捉浮点错误,我为 gfortran 4.9.0 使用了以下编译器选项:

FFLAGS1 = -std=f2003 -ffree-form -fdefault-real-8 -fdefault-double-8  \
          -Ofast -fall-intrinsics -fcheck=all -m64 \
          -fno-trapping-math -c \
          -ffpe-trap=invalid,zero,overflow,underflow,precision,denormal -Wall

使用这些选项,程序在这一行失败:

read(ctrlUnit,*) slope_fasst, aspect

尝试读取这些输入时:10.0 70.0

如果我删除

-ffpe-trap=invalid,zero,overflow,underflow,precision,denormal

从编译器选项中,它可以很好地读取以下行。这两个变量都声明为real(8)。在输入文件中,我尝试了空格、逗号等,但没有看到任何变化。有人有什么建议吗?

【问题讨论】:

运行时系统报告什么错误?程序在失败时试图读取什么? 我正在尝试读取这些输入:10.0 70.0 那些是唯一被读取的输入吗?这有点有趣,因为10.070.0 可以精确地表示为单精度或双精度 IEEE 754 浮点数,因此它一定是 期间发生的错误 i> 触发陷阱的转换过程。理想情况下,如果最终结果不能完全表示,则从字符串转换只会设置不精确标志。 如果@user2417662 回来,也许他可以告诉我们编译器版本。 是的,这些是唯一读入的数字。编译器版本是 gfortran 4.9.0。 【参考方案1】:

似乎 gfortran -ffpe-trap,precision 标志会导致完全正常/常规读/写操作出错。

例如,这个程序抛出“浮动异常”错误:

    write(*,*)1.0
    end

(gfortran 4.1.2,redhat linux)

解决办法,不要使用那个标志。

请注意,这是有道理的,因为从机器号到/从 ascii 的转换会导致精度损失(我不确定标志是否是为了捕捉这种情况)

【讨论】:

是的,precision 听起来它必须对应于通常的 IEEE 754“不精确”陷阱。由于许多浮点运算可能会产生不精确的结果,包括从字符串转换,我想使用浮点的典型程序在设置该标志的情况下将无法使用。 gfortran 4.1.2 是从 2007 年开始的。它是一个非常旧的版本,处于 gfortran 开发的早期阶段。我的意见:不要使用4.4之前的任何版本。 @MarkDickinson:确实“精度”对应于 IEEE 754 不精确异常。这在 2011 年得到了修复,现在 gfortran 改为使用“不精确”(同时保持“精确”作为向后兼容性的别名)。 我取出了精确度,它没有任何区别。 尝试一次删除一个标志,看看是什么原因。 (并发布确切的错误消息可能会有用)

以上是关于浮点错误 gfortran的主要内容,如果未能解决你的问题,请参考以下文章

浮点错误 gfortran

为啥启用浮点异常后出现多个陷阱错误

字典哈希内存错误和特征哈希浮点错误

浮点错误的原因

浮点错误 -1.#J 是啥意思?

为啥这个表达式会导致浮点错误?