除以零并不适用于gfortran 5.4中的ieee_arithmetic

时间:2017-08-17 20:21:07

标签: fortran gfortran

我在运行ieee_arithmetic版本5.4.0的Linux计算机上使用gfortran和Fortran。

我在尝试初始化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)

1 个答案:

答案 0 :(得分:0)

感谢Pascal Cuoq,我解决了这个问题。

编译的sudo子例程的版本如下:

initialize

所以基本上将subroutine initialize(infty,nan) real(kind=DP), intent(out) :: infty, nan infty = huge(1.0_dp)+100 nan = infty-infty end subroutine initialize 设置为最大浮点数加100,然后将infinity设置为无穷大与其自身之间的差异。

非常感谢,感谢您对我缺乏FORTRAN体验的快速反应和耐心。