2017-08-17 23 views
1

我在运行gfortran版本5.4.0的Linux机器上使用带有Fortran的ieee_arithmetic除零不适用于gfortran中的ieee_arithmetic 5.4

当试图初始化InfNaN的值时,我得到除零的错误。

ieee_arithmetic似乎没有问题,因为在文件的其他地方,我可以成功地调用ieee_is_finite()没有问题。

我认为ieee_arithmetic允许除以零被用于这些具体情况,但我必须失去一些东西。下面是一个代码示例:

module rcrlib_gnu 
    use, intrinsic :: ieee_arithmetic ! requires gfortran version 5.0 or higher 
    implicit none 
    integer, parameter :: SP=kind(1.0), DP=selected_real_kind(9,99) 
    integer, parameter :: stderr=0 
    public SP, DP, is_finite, stderr, initialize 

contains 

subroutine initialize(infty,nan) 
    real(kind=DP), intent(out) :: infty, nan 
    infty = 1.0_dp/0.0_dp ! huge(1.0_dp) 
    nan = 0.0_dp/0.0_dp 
end subroutine initialize 

elemental function is_finite(x) 
    real(kind=DP), intent(in) :: x 
    logical :: is_finite 
    is_finite = ieee_is_finite(x) ! This call requires "ieee_arithmetic" 
end function is_finite 

end module rcrlib_gnu 

看来我错过了一些基本的东西,所以我将不胜感激任何帮助。

要重现该错误,上面的代码段保存为rcrlib_gnu_example.f90,然后执行下面的行: gfortran -o rcr rcrlib_gnu_example.f90

将所得误差输出是

rcrlib_gnu_example.f90:12:18: 

    infty = 1.0_dp/0.0_dp ! huge(1.0_dp) 
        1 
Error: Division by zero at (1) 
rcrlib_gnu_example.f90:13:16: 

    nan = 0.0_dp/0.0_dp 
       1 
Error: Division by zero at (1) 
+0

类似的帖子[这里](https://stackoverflow.com/questions/30747019/ieee-arithmetic-intrinsic-module-in-gfortran)和[这里](https://stackoverflow.com/questions/17389958/是否有一个标准的方法来检查无限和南非在90-95)已问过这个问题,但不是我的查询的直接答案。 [This page](http://northstar-www.dartmouth.edu/doc/solaris-forte/manuals/fortran/prog_guide/6_floating.html)表明在ieee_arithmetic中通过零产生'+ Inf'或'NaN' '。 –

+1

它不是Fortran 90.它是Fortran 2003或更高版本。在旧的Fortran 90中没有ieee_arithmetic。 –

+0

向我们显示导致错误或意外行为的代码。见[mcve]。我们必须能够重现问题。 –

回答

0

由于Pascal Cuoq,我解决了这个问题。

initialize子程序,编译的版本低于:

subroutine initialize(infty,nan) 
    real(kind=DP), intent(out) :: infty, nan 
    infty = huge(1.0_dp)+100 
    nan = infty-infty 
end subroutine initialize 

所以基本上设置infinity是最大的浮点数加100,然后设置NaN是无穷大,本身的差别。

谢谢大家,对我的缺乏FORTRAN经验的快速反应和耐心。

+0

As你可以访问IEEE模块,为什么这种方法比使用'ieee_value()'更好?特别是,当设置溢出停止模式时,如果分配给'infty'会发生什么? – francescalus

+0

@francescalus它可能不是一个更好的方法,我不确定你的停止模式的关注。上面的解决方案似乎已经工作(至少在我的机器上编译),但你的观点很好。 –

相关问题