Реальное против Целого в Фортране - PullRequest
0 голосов
/ 20 сентября 2011

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

  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 <<code>ic8t.

1 Ответ

4 голосов
/ 20 сентября 2011

Если вы просто используете переменную INTEGER i (как вы упомянули в своем комментарии), возможно, у вас переполнение арифметики. Вы можете конвертировать i в REAL, как вы это сделали, или выбрать для него подходящий тип параметра . Небольшой пример:

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
...