浮点错误 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.0
和70.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的主要内容,如果未能解决你的问题,请参考以下文章