I have a program which loops over one variable and computes a value at each step:
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
In my first attempt, I used iT as the integer loop counter, and then used it directly in the formula. This produced a piecewise graph for iT > ic8t. When I added i as the counter, and converted iT to real before using it in the formula, the graph came out smooth as it should. Why should it matter whether iT is real or integer when plugging in to the formula? My compiler is g77.
EDIT: The formula gives some inaccurate values for iT < ic8t as well.
If you just use INTEGER variable
i(as you mentioned in your comment) you probably have arithmetic overflow. You can either convertito REAL as you did or choose an appropriate kind parameter for it. A small example: