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

Can someone explain how this is mathematically correct, code in Fortran

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 编译这段代码时,我得到 "Infinity"。如果我用不同的语言编写这段代码,我会得到你不能被零除,这是有道理的,因为 tan(0) = 0 除非在 fortran 中不知何故 0.0D0 <> 0。谢谢。

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

我们第一次尝试除法时我们没有停止,可能会打印一个无穷大的值;第二次了。