0

1つの変数をループし、各ステップで値を計算するプログラムがあります。

  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これにより、 >の区分的グラフが作成されましたic8tiカウンターとして追加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 に答える