8

目前我正在复习我的 Fortran95 知识(不要问为什么)......

我遇到了一个问题。如何处理大整数,例如。大小:~700000000000

INTEGER(KIND=3) 不能保存这个数字。如果有人感兴趣,我可以使用的编译器是 Silverfrost FTN95。

我正在使用整数来遍历更大的数据集。

你有什么建议吗?

4

6 回答 6

17

标准解决方案(从 Fortran 95 开始,所以我假设您的编译器支持它)是使用SELECTED_INT_KIND内在函数来探测有效的整数类型(其值取决于编译器)和HUGE内在函数。

  • SELECTED_INT_KIND (R)返回整数类型的 kind 类型参数,它表示 -10^R < n < 10^R 的所有整数值 n(如果不存在此类类型,则返回 -1)。
  • HUGE (K)返回 K 类整数类型的最大可表示数。

例如,在我的带有 x86_64 处理器(gfortran编译器,64 位模式)的 Mac 上,以下程序:

  print *, selected_int_kind(1)
  print *, selected_int_kind(4)
  print *, selected_int_kind(8)
  print *, selected_int_kind(16)
  print *, selected_int_kind(32)
  print *, selected_int_kind(64)
  print *, huge(0_1)
  print *, huge(0_2)
  print *, huge(0_4)
  print *, huge(0_8)
  print *, huge(0_16)
  end

输出:

           1
           2
           4
           8
          16
          -1
  127
  32767
  2147483647
  9223372036854775807
 170141183460469231731687303715884105727

这告诉我我会integer(kind=8)为你的工作使用一个。

于 2010-03-06T08:20:12.267 回答
8

声明一个至少有 12 个十进制数字的整数“索引”的可移植性是:

integer, parameter :: MyLongIntType = selected_int_kind (12)
integer (kind=MyLongIntType) :: index

“种类=”可以省略。

使用诸如 3 之类的特定值是完全不可移植的,不推荐使用。一些编译器连续使用类型编号,其他编译器使用字节数。“selected_int_kind”将返回编译器可用的最小整数种类的种类号,它可以表示请求的位数。如果不存在该类型,则返回-1,当使用 kind 值声明整数时该值将失败。

gfortran 和 ifort 都返回一个类型,用于输入到 selected_int_kind 最多 18 的十进制数字。像 18 这样的大值通常会选择一个最大正值为 9223372036854775807 的 8 字节整数。它有 19 位,但如果编译器支持这个type 但不是更长的类型, selected_int_kind (19) 将为 -1,因为并非所有 19 位整数都是可表示的。

于 2010-03-06T08:20:42.373 回答
6

There are a number of free arbitrary-precision libraries available for Fortran which would deal with this problem. FMLIB is one. Five or six more alternatives are linked from this page.

于 2010-03-05T23:12:06.227 回答
2

如果您将它用作循环控制变量,但不直接使用整数(我想您不能这样做,因为您不能声明一个大于可表示的最大索引的数组,对吧?),那么我猜测要做的事情是将那只小狗除以 100000 并将其循环嵌套在另一个循环中,该循环迭代了很多次。

于 2010-03-05T22:41:55.597 回答
0

您是否尝试过 INTEGER(KIND=4)?

于 2010-03-05T22:52:00.453 回答
0

我们对此的回答是将值放入双精度变量中并对其执行 DINT 以消除任何小数部分。结果是放置在双精度变量中的整数。函数 DINT 并不总是可用于所有 FORTRAN。该函数是一个双精度整数函数,这将允许非常大的整数(最多 17 位)。

于 2010-03-05T22:54:11.137 回答