Fortran:处理大小的整数值:~700000000000

Dan*_*iel 7 fortran integer numbers long-integer

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

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

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

我使用整数来运行更大的数据集.

你有什么建议吗?

F'x*_*F'x 16

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

  • SELECTED_INT_KIND (R) 返回整数类型的kind类型参数,表示所有整数值n,其中包含?10 ^ R <n <10 ^ R(如果不存在此类型,则返回-1).
  • HUGE (K) 以类型K的整数类型返回最大可表示的数字.

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

  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
Run Code Online (Sandbox Code Playgroud)

输出:

           1
           2
           4
           8
          16
          -1
  127
  32767
  2147483647
  9223372036854775807
 170141183460469231731687303715884105727
Run Code Online (Sandbox Code Playgroud)

这告诉我,我会用integer(kind=8)你的工作.


M. *_* B. 7

用于声明具有至少12个十进制数字的整数"索引"的便携式是:

integer, parameter :: MyLongIntType = selected_int_kind (12)
integer (kind=MyLongIntType) :: index
Run Code Online (Sandbox Code Playgroud)

"kind ="可以省略.

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

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


ire*_*ses 6

Fortran 有许多免费的任意精度库可以解决这个问题.FMLIB就是其中之一.此页面链接了五六个替代方案.