如何迫使gfortran停在First NaN?

时间:2014-12-01 14:59:04

标签: exception fortran cygwin gfortran

我的配置:Cygwin64,Win7 64位,gfortran 4.8.3

我确实经历了我设法找到的所有Q / A对,这一对是我最接近我的问题

Force gfortran to stop program at first NaN

问题:fortran代码

real :: init_with_NaN  ! -finit-real=nan
res = 10 * init_with_NaN 

使用以下gfortran标志编译代码

COLLECT_GCC_OPTIONS='-funderscoring' '-O0' '-g' '-c' '-fmessage-length=0' '-O0' '-g' '-ffpe-trap=invalid,zero,overflow,underflow,precision,denormal' '-Wall' '-c' '-fmessage-length=0' '-Wpedantic' '-std=f2003' '-fall-intrinsics' '-fbacktrace' '-fimplicit-none' '-Wextra' '-Wformat=1' '-Wconversion' '-Wfatal-errors' '-finit-real=nan' '-Wuninitialized' '-fbounds-check' '-v' '-o' 'fsignal_test.o' '-mtune=generic' '-march=x86-64'

运行代码后,不是获取SIGFPE,而是将res设置为NaN并继续执行。

这是一个百万美元问题的子问题: 一旦在程序中的任何地方检测到NaN,gfortran -ffpe-trap =无效标志是否真的会停止程序?特别是在Cygwin64 env?

一项小小的研究表明:

1)Acc.to https://gcc.gnu.org/onlinedocs/gfortran/Debugging-Options.html,-ffpe-trap在MOST系统上运行,而非全部:

2)Acc。到Division by zero does not throw SIGFPE

  

“您没有收到信号,因为大多数机器上的默认行为   是用NaN(非数字)和无穷大来污染你的数据。您   必须启用浮点异常,以及如何执行此操作   机器具体。查看系统头文件fenv.h,如果有的话。   fesettrapenable函数可以捕获浮点数   很多机器都有例外。

     

不幸的是,没有标准功能可以转换浮点数   “

上的异常处理

3)我检查了我的cygwin env,fenv.h存在于多个地方,但在cygwin64下的任何* .h文件下都没有fesettrapenable函数。

4)我确实得到了SIGFPE:比如sqrt(-1),div为零,溢出,下溢,精度

以下是Eclipse中完整的Fortran测试项目,在您的内容中使用它来了解您自己平台上的异常:

https://drive.google.com/file/d/0B9U1dlb_UCPqU194XzhDNTNkUUU/view?usp=sharing

0 个答案:

没有答案