2015-04-03 103 views
0

我正在尝试调试一个Fortran程序。为了赶上浮点错误,我用下面的编译器选项为gfortran 4.9.0:浮点错误gfortran

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)。在输入文件中,我尝试过空格,逗号等,但看不到变化。有没有人有建议?

+2

什么错误呢运行系统报告?程序在失败时试图读取什么? – 2015-04-03 13:56:36

+0

我试图读取这些输入:10.0 70.0 – user2417662 2015-04-03 17:20:00

+0

这些是唯一正在读取的输入吗?这很有趣,因为'10.0'和'70.0' *可以精确地表示为单精度或双精度IEEE 754浮点,所以它必须是在转换过程中发生的触发陷阱的错误。理想情况下,如果最终结果不完全可表示,则字符串转换只会设置不精确标志。 – 2015-04-03 18:36:30

回答

1

看起来gfortran -ffpe-trap,precision标志导致完美正常/例行读/写操作的错误。

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

write(*,*)1.0 
    end 

(gfortran 4.1.2,RedHat Linux上)

解决方案,请不要使用该标志。

注意这是有道理的,因为从机号/从精度损失ASCII成果转化(我不知道如果多数民众赞成标志的意图赶上这样虽然)

+0

是的,'精确'听起来像它必须符合通常的IEEE 754“不确定”陷阱。由于许多浮点操作可能会给出不精确的结果,包括从字符串转换,我想象一下使用浮点的典型程序将无法使用该标志集。 – 2015-04-03 18:31:38

+0

gfortran 4.1.2来自2007年。这是一个非常老的版本,在gfortran开发的早期。我的意见:不要在4.4之前使用任何版本。 – 2015-04-03 20:10:19

+0

@MarkDickinson:确实,“精度”对应于IEEE 754的不精确例外。这在2011年得到了修复,现在gfortran改为使用“不精确”(同时保持“精度”作为向后兼容的别名)。 – janneb 2015-04-03 21:38:09