【问题标题】:How to set Fortran Integer kind如何设置 Fortran 整数类型
【发布时间】:2018-08-17 12:19:16
【问题描述】:
program PEU3
integer(kind=7) :: num = 600851475143
integer(kind=7) :: pf, counter 

这是我的 fortran 代码的一部分。 Num 非常大,所以我尝试将其设置为 kind = 7,但由于某种原因,它仍然抛出 Error 217 - Integer(Kind=3) Constant out of range,对于声明 num 的行,即使我已经声明了num 应该很好 7. 我已经用了一段时间了,我一生都无法理解为什么它不起作用。 非常感谢提供帮助。我的 IDE 是 Plato,带有 silverfrost 编译器,如果相关的话。

【问题讨论】:

标签: fortran fortran95


【解决方案1】:

注意错误是“Constant out of range”,而不是“Variable out of range”。行中的常量

integer(kind=7) :: num = 600851475143

是实际数字:600851475143。默认情况下,您的编译器似乎希望将常量存储为 32 位整数,而这个数字太大了。

最简单的解决方案是告诉编译器将该常量存储为与num 相同的类型,所以按照以下方式进行操作:

integer(kind=7) :: num = 600851475143_7

后面的下划线告诉编译器将常量存储为类型 7 的整数。

但是

我需要指出,哪个数字对应于哪种类型取决于编译器和机器。这意味着,代码不会轻易转移。

所以请使用以下结构之一:

对于较新的编译器(与 Fortran 2008 兼容),请使用内部 iso_fortran_env 模块:

program PEU3
    use iso_fortran_env, only: int64
    implicit none
    integer(kind=int64) :: num = 600851475143_int64

对于较旧的编译器,您可以使用selected_int_kind 方法找出最佳整数类型。它需要一个参数:要存储的(以 10 为基数)的最大位数。 (虽然从技术上讲,如果你传递数字 12,它只会保证 -10^12 ... 10^12 之间的数字,所以你必须传递 13 才能确定你的数字可以被存储。)

integer, parameter :: largeint = selected_int_kind(13)
integer(kind=largeint) :: num = 600851475143_largeint

这两种方法都更易于阅读且独立于编译器,因此更容易移植到新系统。

【讨论】:

  • 我输入了这个:整数,参数 :: my_kind = selected_int_kind(13) integer(kind = my_kind) :: pf, counter, st pf = 0 num = 600851475143,但是我仍然得到同样的错误:217 到分配 num 的行
  • 在这种情况下,检查selected_int_kind(13) 返回的值总是值得的。
  • 对不起,我是新手。我该怎么做?
  • 等等,有没有可能他需要写integer(kind=my_kind) :: num=600851475143_my_kind
  • 我已经完全重写了我的答案,请检查您是否仍然满意。
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多