【问题标题】:Real vs. Integer in FortranFortran 中的实数与整数
【发布时间】:2011-09-20 14:28:10
【问题描述】:

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

  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 提供了一些不准确的值。

【问题讨论】:

  • 您似乎遇到了隐式类型转换的问题 - 某些东西被强制转换为应该是真实的整数。我用我的 g77 副本尝试了一些简单的案例,看看我是否可以重现这一点并且无法 - 尝试上面的示例代码不会编译,因为我的 g77 副本不喜欢 fortran 90 构造。
  • 您的 g77 如何编译 Fortran 90 代码? g77 不只是系统上某些不同编译器的符号链接吗?
  • @Vladimir,我正在使用“Force”程序,我相信它在后端使用 g77。似乎编译器支持Fortran 90的一些特性,但不支持其他特性,这与g77网页文档一致。

标签: fortran fortran90 fortran77 g77


【解决方案1】:

如果您只使用 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

【讨论】:

  • 我发布的程序版本是工作版本。我想要找到的是如果在公式中使用i 而不是iT,程序无法运行的地方。
  • 当你将几千次幂增加到超过 2 时,你可能会出现算术溢出,即当我将是 2000 时,尝试计算 2000**3 将导致算术溢出。所以你基本上计算错误的数字。您可以使用 selected_int_kind() 内部函数为您的 INTEGER 变量 i 选择适当的种类参数,或者像您一样将其设为 REAL。
  • 谢谢!我使用了一个更大的整数类型,它解决了这个问题。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2017-01-11
  • 2017-01-01
  • 2022-07-06
相关资源
最近更新 更多