除以零不适用于 gfortran 5.4 中的 ieee_arithmetic
division by zero doesn't work with ieee_arithmetic in gfortran 5.4
我在运行 gfortran
版本 5.4.0.ieee_arithmetic
的 Linux 机器上使用 Fortran ieee_arithmetic
。
我在尝试初始化 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
看来我缺少一些基本的东西,所以我将不胜感激。
要重现错误,请将上面的代码片段保存为 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)
感谢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 经验的快速回复和耐心等待。
我在运行 gfortran
版本 5.4.0.ieee_arithmetic
的 Linux 机器上使用 Fortran ieee_arithmetic
。
我在尝试初始化 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
看来我缺少一些基本的东西,所以我将不胜感激。
要重现错误,请将上面的代码片段保存为 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)
感谢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 经验的快速回复和耐心等待。