在gfortran 5.4中,使用ieee_arithmetic时,除以零是不可行的。

3
我正在使用Fortran语言中的ieee_arithmetic,在运行gfortran版本5.4.0的Linux机器上。当我尝试为InfNaN初始化值时,出现了除以零的错误。
在文件的其他地方,我可以成功调用ieee_is_finite()而没有任何问题,因此看起来ieee_arithmetic并没有问题。
我认为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)

类似的帖子在这里这里讨论了这个问题,但并没有直接回答我的问题。此页面指出,在ieee_arithmetic中,除以零会产生+InfNaN - Tyler R.
1
这不是Fortran 90,而是Fortran 2003或更高版本。在旧的Fortran 90中没有ieee_arithmetic。 - Vladimir F Героям слава
请展示导致错误或意外行为的代码。请参考[mcve]。我们必须能够“重现”这个问题。 - Vladimir F Героям слава
请注意,获取InfNaN的方法不仅限于除法。如果您需要的是将十进制表示转换为大于最大有限浮点数加半个ULP的值,则会得到Inf,而一旦您拥有了Inf,就可以通过Inf - Inf获得NaN。(不确定这是否有用,但我想提一下以防万一。) - Pascal Cuoq
1
可能是在FORTRAN中具有NaN值的参数(常量)变量的重复问题。 - francescalus
显示剩余11条评论
1个回答

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

所以基本上设置无限大为最大的浮点数加100,然后将NaN设置为无限大与自身之间的差。

感谢大家对我缺乏FORTRAN经验的迅速回应和耐心。


由于您可以访问IEEE模块,为什么这种方法比使用ieee_value()更好呢?特别是在设置溢出停机模式时,当将值赋给infty时会发生什么? - francescalus
@francescalus 这可能不是一个更好的方法,而且我对你的停止模式担忧也不确定。上面的解决方案似乎已经起作用了(至少在我的机器上编译通过),但你提出的观点很有道理。 - Tyler R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接