我有一个程序循环遍历一个变量并在每一步计算一个值:
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}}也是如此。
答案 0 :(得分:4)
如果你只使用INTEGER变量i
(正如你在评论中提到的那样),你可能会有算术溢出。您可以将i
转换为REAL,也可以转换为choose an appropriate kind parameter。一个小例子:
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