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选择适当的种类参数,或者像您那样使其成为现实。谢谢!我使用了一个更大的整数类型,它解决了这个问题。