Fortran中的实数与整数

Fortran中的实数与整数,fortran,fortran90,fortran77,g77,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

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

  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
作为计数器,并在公式中使用它之前将
I
转换为实数时,图形显示出了应有的平滑。插入公式时,为什么它是实数还是整数很重要?我的编译器是77国集团


编辑:公式也为
iT
ic8t给出了一些不准确的值。

如果只使用整型变量
i
(如您在评论中所述),则可能存在算术溢出。您可以按原样将
i
转换为REAL,也可以按原样转换为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

如果只使用整型变量
i
(正如您在评论中提到的),则可能存在算术溢出。您可以按原样将
i
转换为REAL,也可以按原样转换为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

看起来您在隐式类型转换中遇到了问题—某些内容被转换为一个整数,而该整数本应为实数。我用我的77国集团的副本试了几个简单的例子,看看我是否能重现这一点,但失败了——因为我的77国集团副本不喜欢fortran 90结构,所以尝试上面的示例代码不会编译。你的77国集团如何能编译fortran 90代码?g77不就是你系统中不同编译器的符号链接吗?@Vladimir,我使用的是“Force”程序,我相信它在后端使用了g77。编译器似乎支持一些Fortran 90功能,但不支持其他功能,这与77国集团网页文档一致。看起来您遇到了隐式类型转换的问题-某些内容被转换成了一个本应为实的整数。我用我的77国集团的副本试了几个简单的例子,看看我是否能重现这一点,但失败了——因为我的77国集团副本不喜欢fortran 90结构,所以尝试上面的示例代码不会编译。你的77国集团如何能编译fortran 90代码?g77不就是你系统中不同编译器的符号链接吗?@Vladimir,我使用的是“Force”程序,我相信它在后端使用了g77。编译器似乎支持一些Fortran 90功能,但不支持其他功能,这与77国集团网页文档一致。我发布的程序版本是工作版本。我试图找到的是,如果公式中使用了
I
而不是
iT
,程序将无法运行的地方。当将数千次幂提高到2以上时,可能会出现算术溢出,即当我将达到2000时,尝试计算2000**3将导致算术溢出。所以你基本上算错了数字。您可以使用selected_int_kind()内在函数为整型变量i选择适当的种类参数,或者像您那样使其成为现实。谢谢!我使用了一个更大的整数类型,它解决了这个问题。我发布的程序版本就是工作版本。我试图找到的是,如果公式中使用了
I
而不是
iT
,程序将无法运行的地方。当将数千次幂提高到2以上时,可能会出现算术溢出,即当我将达到2000时,尝试计算2000**3将导致算术溢出。所以你基本上算错了数字。您可以使用selected_int_kind()内在函数为整型变量i选择适当的种类参数,或者像您那样使其成为现实。谢谢!我使用了一个更大的整数类型,它解决了这个问题。