2011-09-20 38 views
0

實與整數i已經哪些循環通過一個可變的,並且在每個步驟計算的值的程序:用Fortran

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

它看起來像你碰到了與隱式類型轉換的問題 - 什麼是鑄造成的整數,其中它應該是真實的。我嘗試了幾個簡單的例子,用我的g77副本來查看我是否可以重現這一點,但無法 - 嘗試上面的示例代碼將無法編譯,因爲我的g77副本不喜歡fortran 90構造。 –

+0

你的g77如何編譯Fortran 90代碼? g77不僅僅是系統上某種不同編譯器的符號鏈接? –

+0

@Vladimir,我使用'Force'程序,我相信在後端使用g77。看起來編譯器支持一些Fortran 90功能,但不支持其他功能,這與g77網頁文檔一致。 – astay13

回答

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 
+0

我發佈的程序版本是工作版本。我試圖找到的是如果在公式中使用「i」而不是「iT」,那麼程序不起作用的地方。 – astay13

+0

當你的數字上升到超過2的數字時,你可能會有算術溢出,即當我將是2000時,計算2000 ** 3的嘗試將導致算術溢出。所以你基本上計算錯誤的數字。您可以使用selected_int_kind()內部函數爲您的INTEGER變量i選擇合適的類型參數,或者像您一樣使其成爲REAL。 – Wildcat

+0

謝謝!我使用了一個更大的整數類型,它解決了這個問題。 – astay13