0

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

  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

4

1 回答 1

4

如果您只使用 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
于 2011-09-20T17:14:10.617 回答