Может кто-нибудь объяснить, как это математически правильно, код на Фортране

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 <> 0. Спасибо.

1 ответ

Решение

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

В первый раз, когда мы пробуем деление, мы не останавливаемся, возможно печатая бесконечное значение; во второй раз мы делаем.

Другие вопросы по тегам