【发布时间】:2017-08-17 20:21:06
【问题描述】:
我在运行gfortran 5.4.0 版的Linux 机器上使用ieee_arithmetic 和Fortran。
我在尝试初始化 Inf 和 NaN 的值时遇到除零错误。
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
我似乎遗漏了一些基本的东西,所以我将不胜感激。
要重现错误,请将上面的代码 sn -p 保存为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)
【问题讨论】:
-
它不是 Fortran 90。它是 Fortran 2003 或更高版本。旧的 Fortran 90 中没有 ieee_arithmetic。
-
向我们展示导致错误或意外行为的代码。见minimal reproducible example。我们必须能够重现问题。
-
请注意,如果您想要的话,除了除法之外,还有其他方法可以获得
Inf和NaN。转换大于最大有限浮点数 + 半个 ULP 的十进制表示会产生Inf,一旦你有Inf,你就可以得到NaN和Inf - Inf。 (不确定这是否有用,但我想我应该指出它以防万一。)