Exception 如何迫使格弗特兰一开始就停下来?

Exception 如何迫使格弗特兰一开始就停下来?,exception,fortran,cygwin,gfortran,Exception,Fortran,Cygwin,Gfortran,我的配置:Cygwin64、Win7 64位、gfortran 4.8.3 我确实查阅了我找到的所有问答对,这一对最接近我的问题 问题: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'

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

我确实查阅了我找到的所有问答对,这一对最接近我的问题

问题: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并继续执行

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

一些研究表明:

1根据-ffpe陷阱适用于大多数系统,而不是所有系统:

2根据

您不会收到信号,因为大多数机器上的默认行为 就是用NaN非数字和无穷大来污染你的数据。你 必须启用浮点异常,以及如何做到这一点 特定于机器。查看系统标题fenv.h,如果有。 函数fesettrapenable允许捕获浮点 许多机器上的异常

不幸的是,没有标准函数来转换浮点值 上的异常处理

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

4我确实得到了SIGFPEs:比如sqrt-1,按零div,溢出,下溢,精度

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


“测试项目”链接为您提供了重新设置此情况的测试代码。查找res=10*init_和_NaN。可能的重复项