Реальное против Целого в Фортране

У меня есть программа, которая перебирает одну переменную и вычисляет значение на каждом шаге:

  program cpout

  implicit none

  !declarations
    integer, parameter :: dp = selected_real_kind(15)
                ! kind value for double precision

    real(dp), parameter :: Ru = 8.314472_dp    
    real(dp) :: cp
    integer :: loT, hiT, i
    real(dp) :: iT
    real(dp),dimension(14) :: ic8a
    real(dp) :: ic8t
    real(dp) :: ic8c

    loT = 300
    hiT = 3000

! ic8a is populated using a subroutine call
! I have checked, it reads in reals as it is supposed to

    do i = loT, hiT, 1

      iT = real(i,dp)

      if (iT > ic8t) then
        ic8c = Ru*(ic8a(1) + ic8a(2)*iT + ic8a(3)*(iT**2)
 *                 + ic8a(4)*(iT**3) + ic8a(5)*(iT**4))
      else
        ic8c = Ru*(ic8a(8) + ic8a(9)*iT + ic8a(10)*(iT**2)
 *                 + ic8a(11)*(iT**3) + ic8a(12)*(iT**4))
      end if

    end do

  end program cpout

В моей первой попытке я использовал iT в качестве счетчика целочисленных циклов, а затем использовать его непосредственно в формуле. Это дало кусочный график для iT > ic8t, Когда я добавил i как счетчик, так и преобразованный iT перед тем, как использовать его в формуле, график получился гладким, как и должно быть. Почему это должно иметь значение iT является действительным или целым числом при подключении к формуле? Мой компилятор g77.

РЕДАКТИРОВАТЬ: формула дает некоторые неточные значения для iT < ic8t также.

1 ответ

Решение

Если вы просто используете переменную INTEGER i (как вы упомянули в своем комментарии) вы, вероятно, переполнены арифметикой. Вы можете конвертировать i НАСТОЯЩИМ, как вы сделали, или выберите соответствующий параметр типа для него. Небольшой пример:

PROGRAM ex

  IMPLICIT NONE

  INTEGER, PARAMETER :: long = selected_int_kind(10)

! Here we have arithmetic overflow  
! PRINT *, 2000**3
! But not here
  PRINT *, 2000_long**3

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