有人可以解释这在数学上是如何正确的,Fortran中的代码

时间:2017-08-11 17:05:24

标签: fortran fortran77

program sum
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
x = 1
y = 2
z = (x*y)/dtan(0.0D0) 
print *, z
end program sum

当我使用Online Fortran Compiler编译此代码时,我得到“无限”。如果我用不同的语言编写这个代码,我得到你不能除以零,这是有道理的,因为tan(0)= 0,除非在某种程度上在fortran中0.0D0<>谢谢你。

1 个答案:

答案 0 :(得分:2)

Fortran没有直接描述程序的预期结果,结果将取决于处理器的算术模型。

如果我们假设正在使用IEEE算法,那么3d0/0d0的评估将发出ieee_divide_by_zero标志的信号。人们也可以合理地预期分裂的结果是正无穷大。

引发异常标志时会发生什么情况取决于编译器。当这样的标志发出信号时,编译器可以默认停止,或者它可以继续。编译器也可能有编译时选项来更改响应。

考虑(Fortran 2003)计划:

  use, intrinsic :: ieee_exceptions
  implicit none
  real(kind(0d0)) x

  x=1

  call ieee_set_halting_mode(ieee_divide_by_zero, .false.)
  print *, x/0

  call ieee_set_halting_mode(ieee_divide_by_zero, .true.)
  print *, x/0
end

我们第一次尝试划分时,我们不会停止,可能会打印无限值;我们第二次这样做。