Fortran中的Real vs. Integer

时间:2011-09-20 14:28:10

标签: fortran fortran90 fortran77 g77

我有一个程序循环遍历一个变量并在每一步计算一个值:

  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}}也是如此。

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